关于如何在vue路由器中“if-else”组件?和vue路由beforeeach的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于javascript-如何在Vuetify组件中以编程方式设
关于如何在vue路由器中“ if-else”组件?和vue路由beforeeach的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于javascript-如何在Vuetify组件中以编程方式设置组件属性、laravel – 如何在vue js中将数据从一个组件传递到另一个组件?、Markdown文件居然也可以直接作为Vue路由组件?、react router @4 和 vue路由 详解(一)vue路由基础和使用等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- 如何在vue路由器中“ if-else”组件?(vue路由beforeeach)
- javascript-如何在Vuetify组件中以编程方式设置组件属性
- laravel – 如何在vue js中将数据从一个组件传递到另一个组件?
- Markdown文件居然也可以直接作为Vue路由组件?
- react router @4 和 vue路由 详解(一)vue路由基础和使用
如何在vue路由器中“ if-else”组件?(vue路由beforeeach)
如何解决如何在vue路由器中“ if-else”组件??
我目前正在将vue与vue-router一起使用。而且我有一个小问题要解决,也许您可以帮忙。
我想要的结果是,登录后,我想使用 Auth.vue 作为父级,并使用 Home.vue 作为其内容。而且,如果用户未经身份验证/已注销,则将使用 Guest.vue 和 Welcome.vue 作为其内容。我希望他们都使用相同的路径/
。
现在下面的代码在登录后可以正常工作,问题出在我注销后,即使user.isLoggedIn()
为假,它仍然使用 Auth.vue 和 Home。 vue
任何建议如何实现这一目标?
现在这是我的 router.js
{
path: ''/login'',name: ''login'',component: () => import(''./Login''),},{
path: ''/'',component: () => {
if(user.isLoggedIn()) {
return import(''./views/layouts/Auth'');
}else {
return import(''./views/layouts/Guest'');
}
},children: [
{
path: ''/'',name: ''home'',component: () => {
if(user.isLoggedIn()) {
return import(''./views/Home'');
}else {
return import(''./views/Welcome'');
}
},],
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
javascript-如何在Vuetify组件中以编程方式设置组件属性
我有一个定义的复选框组件,如下所示:
let checkBox = this.$createElement(VCheckBox,{
props: {
hideDetails: true
}
});
在我的代码中,我可以获得对该组件的引用.换句话说,我可以访问此复选框变量.我想要的是以编程方式设置属性.按属性,我指的是组件的这一部分:
props: {
hideDetails: true
}
我想要的是将不确定性设置为true.就像是:
checkBox.setProperty('indeterminate',true);
但我无法在文档中找到与我的问题有关的任何内容.那么,我该如何实现呢?
data: function() {
return {
stateDetails: true
};
}
然后在道具中使用它:
props: {
hideDetails: this.stateDetails
}
现在您可以像这样更改值:
this.stateDetails = true / false
laravel – 如何在vue js中将数据从一个组件传递到另一个组件?
这是第一个和第二个组件的代码.
SelectPerson.vue
<template> ...... <div> <input type="number"name="numberOfPersons" placeholder="Enter number of persons here" **v-model="inputPersons"**> <br> **<SelectTimeSlot v-bind:numberOfPersons="inputPersons"></SelectTimeSlot>** </div> <div> <buttonv-on:click="selectTimeSlots">Next</button> </div> ...... </template> <script> import SelectTimeSlot from './SelectTimeSlot.vue' export default{ props:['numberOfPersons'],data(){ return{ **inputPersons:0** } },methods:{ selectTimeSlots(){ this.$router.push({name:'SelectTimeSlot'}); } } } </script>
第二部分
SelectTimeSlot.vue
<template> <h5>Welcome,You have selected **{{numberOfPersons}}** persons.</h5> </template>
有人可以帮我吗?
解决方法
第一部分:
<second-component-name :selectedOption="selectedOption"></second-component-name> <script> export default { components: { 'second-component-name': require('./secondComponent.vue'),},data() { return { selectedOption: '' } } } </script>
第二部分:
<template> <div> {{ selectedOption }} </div> </template> <script> export default { props: ['selectedOption'] } </script>
请访问this link.
希望这对你有所帮助!
Markdown文件居然也可以直接作为Vue路由组件?
本文为Varlet组件库源码主题阅读系列第五篇,读完本文你可以了解到如何通过编写一个
Vite
插件来支持使用md
文件直接作为路由组件。
之前文档站点的搭建里我们介绍了路由的动态生成逻辑,其中说到了文档是使用Markdown
格式编写的,并且还直接在路由文件里使用md
文件作为路由组件:
路由就是路径到组件的映射,这个组件显然指的是Vue
组件,Vue
组件是一个包含特定选项的JavaScript
对象,我们平常开发一般使用的是Vue
单文件,单文件最终也会被编译成选项对象,这个工作是@vitejs/plugin-vue做的,显然这个插件并不能处理Markdown
文件,那么最终也就无法生成正确的Vue
组件。
解决方法就是编写一个Vite插件,指定在@vitejs/plugin-vue
插件之前调用,将.md
文件的内容转换为Vue
单文件的格式,然后配置@vitejs/plugin-vue
插件,让它顺便也处理一下扩展名为.md
的文件,因为已经转换成Vue
单文件的语法格式了,所以它可以正常处理,接下来从源码角度来详细了解一下。
Vite配置
之前的文章里详细介绍了启动服务时的Vite
配置,这里只看一下涉及到的插件部分:
// varlet-cli/src/config/vite.config.ts
import vue from ''@vitejs/plugin-vue''
import md from ''@varlet/markdown-vite-plugin''
export function getDevConfig(varletConfig: Record<string, any>): InlineConfig {
return {
plugins: [
vue({
include: [/\.vue$/, /\.md$/],// vue插件默认只处理.vue文件,通过该参数配置让其也处理一下.md文件
}),
md({ style: get(varletConfig, ''highlight.style'') }),// 使用md文件转换插件,使用插件时可以传入参数
]
}
}
markdown-vite-plugin插件
插件代码在varlet-markdown-vite-plugin
目录,一个Vite
插件就是一个函数,接收使用时传入的参数,最终返回一个对象。Vite
插件扩展了Rollup
的接口,并且带有一些 Vite
独有的配置项,配置项类型基本就是两种,一种是属性,一种是钩子函数,插件的主要逻辑都在钩子函数里,Rollup
和Vite
提供了构建和编译时各个时机的钩子,插件可以根据功能选择对应的钩子。
Vite
插件文档:插件API。
Rollup
插件文档:plugin-development。
// varlet-markdown-vite-plugin/index.js
function VarletMarkdownVitePlugin(options) {
return {
name: ''varlet-markdown-vite-plugin'',// 插件名称
enforce: ''pre'',// 插件调用顺序
// Rollup钩子,转换文件内容
transform(source, id) {
if (!/\.md$/.test(id)) {
return
}
try {
return markdownToVue(source, options)
} catch (e) {
this.error(e)
return ''''
}
},
// Vite钩子,用于热更新
async handleHotUpdate(ctx) {
if (!/\.md$/.test(ctx.file)) return
const readSource = ctx.read
ctx.read = async function () {
return markdownToVue(await readSource(), options)
}
},
}
}
module.exports = VarletMarkdownVitePlugin
以上就是这个插件的函数,返回了一个对象,name
属性为插件的名称,必填,用于信息和错误输出时的提示;enforce
用于指定钩子的调用顺序:
vue
插件没有指定,所以md
插件会在其之前调用,保证到它这里.md
文件的内容已经转换完毕。
接下来配置了两个钩子函数,我们详细来看。
md文件内容转换
transform是Rollup
提供的构建阶段的钩子,可以在这个钩子内转换文件的内容,先判断文件后缀是否是.md
,不是的话就不进行处理,是的话调用了markdownToVue
方法:
// varlet-markdown-vite-plugin/index.js
function markdownToVue(source, options) {
const { source: vueSource, imports, components } = extractComponents(source)
// ...
}
支持在md文件中引入Vue组件
source
即文件内容,进来先调用了extractComponents
方法,这个方法是干嘛的呢,是用来支持在md
文件里引入Vue
组件的,比如布局组件中的Row
组件的文档:
引入了Responsive.vue
组件,最终在页面上的渲染效果如下:
知道了它的作用后我们再来看一下实现:
// varlet-markdown-vite-plugin/index.js
function extractComponents(source) {
const componentRE = /import (.+) from [''"].+[''"]/
const importRE = /import .+ from [''"].+[''"]/g
const vueRE = /```vue((.|\r|\n)*?)```/g
const imports = []
const components = []
// 替换```vue....```的内容
source = source.replace(vueRE, (_, p1) => {
// 解析出import语句列表
const partImports = p1.match(importRE)
const partComponents = partImports?.map((importer) => {
// 去除换行符
importer = importer.replace(/(\n|\r)/g, '''')
// 解析出导入的组件名
const component = importer.replace(componentRE, ''$1'')
// 收集导入语句及导入的组件
!imports.includes(importer) && imports.push(importer)
!components.includes(component) && components.push(component)
// 返回使用组件的字符串
return `<${kebabCase(component)} />`
})
return partComponents ? `<div>${partComponents.join(''\n'')}</div>` : ''''
})
return {
imports,
components,
source,
}
}
以前面的为例,source
为:
xxx
```vue
import BasicExample from ''../example/Responsive.vue''
```
xxx
匹配到vueRE
,p1
为:
import BasicExample from ''../example/Responsive.vue''
使用importRE
正则匹配后可以得到partImports
数组:
[
`import BasicExample from ''../example/Responsive.vue''`
]
遍历这个数组,然后解析出component
为BasicExample
,将导入语句及组件名称收集起来,然后拼接模板字符串为:
<div>
<basic-example />
</div>
最后这个模板字符串会替换掉source
内vueRE
匹配到的内容。
代码高亮
让我们继续回到markdownToVue
方法:
// varlet-markdown-vite-plugin/index.js
const markdown = require(''markdown-it'')
function markdownToVue(source, options) {
// ...
const md = markdown({
html: true,// 允许存在html标签,这是必要的,因为前面处理Vue组件最后会生成html标签
typographer: true,// 允许替换一些特殊字符,https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.js
highlight: (str, lang) => highlight(str, lang, options.style),// 代码高亮,str为要高亮的代码,lang为语言种类
})
}
使用markdown-it解析markdown
,并且使用了highlight
属性自定义代码语法高亮:
// varlet-markdown-vite-plugin/index.js
const hljs = require(''highlight.js'')
function highlight(str, lang, style) {
let link = ''''
if (style) {
link = ''<linkrel="stylesheet" href="'' + style + ''"/>''
}
if (lang && hljs.getLanguage(lang)) {
return (
''<pre><code>'' +
link +
hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +
''</code></pre>''
)
}
return ''''
}
代码高亮使用的是highlight.js,最开始使用md
插件时我们传入了参数:
{ style: get(varletConfig, ''highlight.style'') }
这个用于设置highlight.js
的主题,一个主题就是一个css
文件,highlight.js
内置了非常多的主题:
默认配置如下:
所以当指定了主题的话会创建一个link
标签来加载对应的主题样式,否则就使用默认的,默认主题定义在/site/pc/Layout.vue
组件内:
这么做的好处是可以使用css
变量,当页面切换暗黑模式时代码主题也可以跟着变化。
处理生成的html
继续看markdownToVue
方法:
// varlet-markdown-vite-plugin/index.js
function markdownToVue(source, options) {
// ...
let templateString = htmlWrapper(md.render(vueSource))
templateString = templateString.replace(/process.env/g, ''<span>process.env</span>'')
}
调用render
方法将markdown
编译成html
,然后调用了htmlWrapper
方法:
// varlet-markdown-vite-plugin/index.js
function htmlWrapper(html) {
const hGroup = html.replace(/<h3/g, '':::<h3'').replace(/<h2/g, '':::<h2'').split('':::'')
const cardGroup = hGroup
.map((fragment) => (fragment.includes(''<h3'') ? `<div>${fragment}</div>` : fragment))
.join('''')
return cardGroup.replace(/<code>/g, ''<code v-pre>'')
}
前两行做的事情就是把h3
标签之后,h2
标签之前的内容都用类名为card
的div
包裹起来,目的是为了在页面上显示一个个块的效果:
最后一行是给code
标签添加了一个v-pre
指令,这个指令用来跳过该元素及其所有子元素的编译,因为文档的代码示例难免会涉及到Vue
模板语法的示例,如果不跳过,直接就被编译了。
引入代码块组件
继续markdownToVue
方法:
// varlet-markdown-vite-plugin/index.js
function markdownToVue(source, options) {
// ...
templateString = injectCodeExample(templateString)
}
又调用了injectCodeExample
方法:
// varlet-markdown-vite-plugin/index.js
function injectCodeExample(source) {
const codeRE = /(<pre>(.|\r|\n)*?<\/pre>)/g
return source.replace(codeRE, (str) => {
const flags = [
''// playground-ignore\n'',
''<span>#</span><span> playground-ignore</span>\n'',
''<span>// playground-ignore</span>\n'',
''<span>/* playground-ignore */</span>\n'',
''<span><!-- playground-ignore --></span>\n'',
]
const attr = flags.some((flag) => str.includes(flag)) ? ''playground-ignore'' : ''''
str = flags.reduce((str, flag) => str.replace(flag, ''''), str)
// 引入var-site-code-example组件
return `<var-site-code-example ${attr}>${str}</var-site-code-example>`
})
}
Varlet
提供了在线playground
的功能:
可以直接从文档的代码块进行跳转:
但不是所有代码块都需要,比如:
所以就通过在文档上增加一个注释来注明忽略:
injectCodeExample
方法就会检查是否存在这个标志,存在的话就给var-site-code-example
组件传递一个不显示这个跳转按钮的属性,var-site-code-example
组件的路径为/site/components/code-example/CodeExample.vue
,用来提供代码块的展开收起、复制、跳转playground
的功能。
组装Vue单文件的格式
最后就是按照Vue
单文件的格式进行拼接了:
// varlet-markdown-vite-plugin/index.js
function markdownToVue(source, options) {
// ...
return `
<template>
<div>${templateString}</div>
</template>
<script>
${imports.join(''\n'')}
export default {
components: {
${components.join('','')}
}
}
</script>
`
}
把转换得到的html
内容添加到template
标签内,把解析出的组件导入语句添加到script
标签内,并且进行注册,转换成这种格式后,后续vue
插件就可以正常处理了。
热更新
除了transform
钩子,还使用到了handleHotUpdate钩子,这个钩子是Vite
提供的,用来执行自定义的热更新处理,这个钩子接收一个上下文对象:
file
是发生变化的文件,read
是读取这个文件内容的方法,varlet-markdown-vite-plugin
插件重写了这个方法:
// varlet-markdown-vite-plugin/index.js
function VarletMarkdownVitePlugin(options) {
return {
async handleHotUpdate(ctx) {
if (!/\.md$/.test(ctx.file)) return
const readSource = ctx.read
ctx.read = async function () {
return markdownToVue(await readSource(), options)
}
},
}
}
目的和前面一样,就是把markdown
语法转换成Vue
单文件语法,vue
插件也使用了这个钩子和read
方法:
同样因为这个插件是在vue
插件之前调用的,所以到了vue
插件使用的就是被转换的read
方法,就能在热更新时顺利处理.md
文件。
处理markdown
的插件就介绍到这里,我们下一篇再见,拜拜~
react router @4 和 vue路由 详解(一)vue路由基础和使用
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html
1、vue路由基础和使用
a、大概目录
我这里建了一个router文件夹,文件夹下有index.html
b、准备工作:
npm install vue-router
或者 yarn add vue-router
c、配置
必须要通过 Vue.use() 明确地安装路由功能:
在你的文件夹下的 src 文件夹下的 main.js 文件内写入以下代码
import Vue from ''vue''
import VueRouter from ''vue-router''
Vue.use(VueRouter)
附上我的代码:我是将router的内容写在了我的router文件夹下的index.html中,然后暴露出去,在main.js中引入
router文件夹下的index.html
import Vue from ''vue''
import VueRouter from ''vue-router''
Vue.use(VueRouter)
import Home from ''pages/Home''
import Map from ''components/Map''
import Home1 from ''components/Home1''
import Find from ''components/Find''
import Mine from ''components/Mine''
import Type from ''components/Type''
import Publish from ''components/Publish''
import Search from ''components/Search''
import Success from ''components/Success''
import Need from ''components/Need''
import Position0 from ''components/Position''
import Like from ''components/scrollX/Like''
import S1 from ''components/scrollX/1''
import S2 from ''components/scrollX/2''
import Listall from ''components/mine/Listall''
import Listone from ''components/mine/Listone''
import Listchange from ''components/mine/Listchange''
const routes = [
{
path:''/'',
redirect:''/ho''
},
{
path: ''/ho'',
redirect:''/ho/home'',
component: Home,
children: [
{
name: ''home'',
path: ''home'',
component: Home1,
redirect:''/ho/home/like'',
children :[
{
name: ''like'',
path: ''like'',
component: Like
},
{
name: ''2000001'',
path: ''2000001'',
component: S1
},
{
name: ''2000022'',
path: ''2000022'',
component: S2
}
]
},
{
name: ''type'',
path: ''type'',
component: Type
},
{
name: ''need'',
path: ''need'',
component: Need
},
{
name: ''find'',
path: ''find'',
component: Find
},
{
name: ''mine'',
path: ''mine'',
component: Mine
}
]
},
{
name: ''search'',
path: ''/search'',
component: Search
},
{
name: ''position'',
path: ''/position'',
component: Position0
},
{
name: ''publish'',
path: ''/publish'',
component: Publish
},
{
name: ''success'',
path: ''/success'',
component: Success
},
{
name: ''listall'',
path: ''/listall'',
component: Listall
},
{
name: ''listone'',
path: ''/listone'',
component: Listone
},
{
name: ''listchange'',
path: ''/listchange'',
component: Listchange
},
{
name: ''map'',
path: ''/map'',
component: Map
}
]
const router = new VueRouter({
mode: ''history'',
routes
})
export default router

main.js

import Vue from ''vue''
import App from ''./App.vue''
import router from ''./router''
Vue.use(MintUI)
Vue.use(ElementUI);
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App)
}).$mount(''#app'')

d、常规使用


<template>
<div>
<router-view></router-view>
<Ibar></Ibar>
</div>
</template>

那么在Ibar页面中如何切换路由呢?

<template>
<div>
<router-link to="/ho/home" tag="span" active->首页</router-link>
<router-link to="/ho/type" tag="span" active->类别</router-link>
<router-link to="/ho/need" tag="span" active->需求</router-link>
<router-link to="/ho/find" tag="span" active->发现</router-link>
<router-link to="/ho/mine" tag="span" active->我的</router-link>
</div>
</template>

注意:此处的tag=“span”代表这个按钮是个span标签,你可以写样式的时候直接写span标签的样式即可
此处的active-代表点击哪个按钮哪个按钮高亮
此时我们详细看一下router文件夹下的index.js

//引入vue
import Vue from ''vue''
//引入路由
import VueRouter from ''vue-router''
//把路由挂载到vue上
Vue.use(VueRouter)
//引入我各个路由对应的component组件
import Home from ''pages/Home''
import Map from ''components/Map''
import Home1 from ''components/Home1''
import Find from ''components/Find''
import Mine from ''components/Mine''
import Type from ''components/Type''
import Publish from ''components/Publish''
import Search from ''components/Search''
import Success from ''components/Success''
import Need from ''components/Need''
import Position0 from ''components/Position''
import Like from ''components/scrollX/Like''
import S1 from ''components/scrollX/1''
import S2 from ''components/scrollX/2''
import Listall from ''components/mine/Listall''
import Listone from ''components/mine/Listone''
import Listchange from ''components/mine/Listchange''
const routes = [
{
//path是路由的路径
path:''/'',
//redirect代表重定向,因为当前路径''/''并没有对应的组件,所以需要重定向到其他路由页面
redirect:''/ho''
},
{
path: ''/ho'',
redirect:''/ho/home'',
//当不需要重定向的时候,需要component写上当前路由对应的组件页面
component: Home,
//有些路由还有子路由,需要用到children[],
//当访问的时候,<router-link>的属性to的时候要把所有的父组件都带上
//如:此处的/ho/home/like
children: [
{
name: ''home'',
path: ''home'',
component: Home1,
redirect:''/ho/home/like'',
children :[
{
name: ''like'',
path: ''like'',
component: Like
},
{
name: ''2000001'',
path: ''2000001'',
component: S1
},
{
name: ''2000022'',
path: ''2000022'',
component: S2
}
]
},
{
name: ''type'',
path: ''type'',
component: Type
},
{
name: ''need'',
path: ''need'',
component: Need
},
{
name: ''find'',
path: ''find'',
component: Find
},
{
name: ''mine'',
path: ''mine'',
component: Mine
}
]
},
{
name: ''search'',
path: ''/search'',
component: Search
},
{
name: ''position'',
path: ''/position'',
component: Position0
},
{
name: ''publish'',
path: ''/publish'',
component: Publish
},
{
name: ''success'',
path: ''/success'',
component: Success
},
{
name: ''listall'',
path: ''/listall'',
component: Listall
},
{
name: ''listone'',
path: ''/listone'',
component: Listone
},
{
name: ''listchange'',
path: ''/listchange'',
component: Listchange
},
{
name: ''map'',
path: ''/map'',
component: Map
}
]
const router = new VueRouter({
//此处设置mode为history,即不带#号,在处理数据的时候会更方便一些
mode: ''history'',
//ES6的写法,即routes:routes的简写,当key和value名字一样时,可简写
routes
})
//把你创建的路由暴露出去,使得main.js可以将其引入并使用
export default router

引申1:
路由有一个meta属性
可以给该路由挂载一些信息
设置一些自己title、显示隐藏、左右滑动的方向之类的
meta: {
title: "HelloWorld", 要现实的title
show: true 设置导航隐藏显示
}
使用的时候:this.$route.meta.show
<Bottom v-show=
"this.$route.meta.show"
></Bottom>
引申2:
动态路由
{
path:"/two/:id",
component:Two,
}
获取数据this.$route.params.动态路由的名字
此处是:this.$route.params.id
引申3:
路由别名alias

{
path: ''/a'',
component: A,
alias: ''/b''
}
// /a 的别名是 /b
//意味着,当用户访问 /b 时,URL 会保持为 /b,但是路由匹配则为 /a
//就像用户访问 /a 一样
//简单的说就是给 /a 起了一个外号叫做 /b ,但是本质上还是 /a

今天关于如何在vue路由器中“ if-else”组件?和vue路由beforeeach的分享就到这里,希望大家有所收获,若想了解更多关于javascript-如何在Vuetify组件中以编程方式设置组件属性、laravel – 如何在vue js中将数据从一个组件传递到另一个组件?、Markdown文件居然也可以直接作为Vue路由组件?、react router @4 和 vue路由 详解(一)vue路由基础和使用等相关知识,可以在本站进行查询。
本文标签: