递归组件与vue路由
Posted akby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归组件与vue路由相关的知识,希望对你有一定的参考价值。
递归:函数自己调用自己
//递归可以将复杂的问题简化
//递归特征:必须有一个能结束递归的条件
例如:
1.阶乘
function jiecheng(n) {
if(n===1) return 1;
return n * jiecheng(n-1)
}
2.fibonaci数列
function fibonaci(n) {
if(n<=2) return 1;
return fibonaci(n-1)+fibonaci(n-2);
}
组件自己调用自己的name名来实现递归调用 添加一个显示和隐藏的功能
具体代码如下:
父组件(my.vue)代码:
<template>
<div>
<tree-com
:title="treeObj.name"
:list="treeObj.children"
:depth="0">
</tree-com>
</div>
</template>
<script>
import TreeCom from ‘../components/tree‘
// 模拟一个树形结构【注意:应该是后台返回的数据】
const treeObj = {
name: ‘电子产品‘,
children: [
{
name: ‘电视‘,
children: [
{
name: ‘philips‘,
children: [
{ name: ‘philips-A‘ },
{ name: ‘philips-B‘ }
]
},
{ name: ‘Tcl‘ },
{ name: ‘海信‘ }
]
},
{
name: ‘电脑‘,
children: [
{ name: ‘Mac Air‘ },
{ name: ‘Mac Pro‘ },
{
name: ‘ThinkPad‘,
children: [
{
name: ‘ThinkPad-A‘,
children:[
{name:‘ThinkPad-A-A‘},
{name:‘ThinkPad-A-B‘},
{name:‘ThinkPad-A-C‘},
] },
{ name: ‘ThinkPad-B‘ }
]
}
]
},
{
name: ‘可穿戴设置‘,
children: [
{
name: ‘手表‘,
children: [
{ name: ‘iWatch‘ },
{ name: ‘小米watch‘ }
]
}
]
}
]
}
export default {
name: ‘my‘,
data () {
return {
treeObj
}
},
components: { TreeCom }
}
</script>
<style lang="scss">
</style>
树形组件(tree.vue)代码:
<template>
<div>
<div class="title" :style="indent" @click="toggle">
<span>{{ isShow ? ‘-‘:‘+‘ }}</span>
{{ title }}
</div>
<div v-if="isShow">
<tree-com
v-for="(item,index) in list"
:key="index"
:title="item.name"
:list="item.children"
:depth="depth+1" //树形样式缩进
>
</tree-com>
</div>
</div>
</template>
<script>
export default {
name: ‘tree-com‘, // 通过组件自身的name来实现组件的递归调用
data () {
return {
isShow: true, //显示或隐藏状态控制
}
},
props: {
title: { //当前接收要显示的标题
type: String,
default: ‘名称‘
},
list: { //要递归的数组
type: Array
},
depth: { //显示层级
type: Number,
default: 0
}
},
computed: {
//通过计算属性计算缩进样式
indent () {
return `transform:translate(${this.depth * 20}px)`
}
},
methods: {
//切换显示隐藏状态
toggle () {
this.isShow = !this.isShow;
}
}
}
</script>
<style lang="scss">
</style>
vue路由(实现单页应用的技术或称SPA)
前端路由实现原理:
浏览器哈希值:在浏览器url地址后面添加#/名子,如果改变哈希值,通过onhashchange可以监听到到变化 参考资料:https://blog.csdn.net/sunxinty/article/details/52586556 通过浏览器H5暴露的History API 参考mdn的history官方文档:https://developer.mozilla.org/zh-CN/docs/Web/API/History 参考博客:https://www.zhangxinxu.com/wordpress/2013/06/html5-history-api-pushstate-replacestate-ajax/
Vue路由模式有哪几个:
通过mode来设置Vue路由模式:
? hash:,带# 【默认】
优点:兼容性好,不需要后端配置
缺点:路径不美观 例如:http://127.0.0.1:9999/#/shopping
? history:通过/来分隔路径
优点:路径美观 http://127.0.0.1:9999/shopping 缺点:有兼容性和需要后端配置,如果后端不配置路径重定义,点击页面会报打不开的错误
Vue路由懒加载
例如:const Home = () => import(‘../views/home.vue‘);
Vue路由如何传参,动态路由
query传参:
1.视图传递:
<router-link to="/路径?名称=会传递的值">内容</router-link>
或
<router-link :to="{path:‘/user‘,query:{ name:‘1906A‘ }}">内容</router-link>
注意:不用配置路由配:
3.视图接收:
<div>User {{ $route.query.name }}</div>‘
在JS中接收:
this.$route.pquery.name
params传参
1.视图传递:
<router-link to="/路径/会传递的值">内容</router-link>
例如:
<router-link to="/user/1906A">/user/bar</router-link>
2.路由配置:
const router = new VueRouter({
routes: [
{ path: ‘/user/:name‘, component: User }
]
})
3.视图接收:
<div>User {{ $route.params.id }}</div>‘
在JS中接收:
this.$route.params.id
参考官方文档:https://router.vuejs.org/zh/guide/essentials/navigation.html
历史回退:
router.go(-1) //返回上一页 this.$route和this.$router的区别是什么 this.$route:获取路由参数 this.$router:跳转页面
路由404页
{ // 匹配不符合上面路径的路由
path: ‘/*‘,
component: NotFound
}
响应路由参数的变化
动态路由传参:如果给一个路由组件传递不同参数,如何响应参数的变化,主要通过watch来监听$route
watch:{
$route(to,from) {
console.log(‘watch:‘,to.params.type)
}
},
嵌套路由:可以实现二级路由,三级路由。。。。。
通过配置路由的children和要在哪个页面展示对应路由的router-view配合实现
例如:
{
path: ‘/my‘,
component: My,
children: [
{ //配置默认的二级路由
path: ‘‘,
component: My1
},
{
path: ‘my2‘,
component: My2
},
{
path: ‘my3‘,
component: My3
}
]
},
以上是关于递归组件与vue路由的主要内容,如果未能解决你的问题,请参考以下文章