vue 组件传值
一、父传子
父组件和子组件依赖组件标签取得关联 ,在组件标签上所有属性构成的集合在子组件的props属性里
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <p>{{mes}}</p> <heads :name="mes"></heads> <!--组件标签 使用v-bind绑定name属性--> </div> </body> </html> <template id="temp1"> <div> <p class="titl">{{title}}</p> </div> </template> <script> let Heads = { template:"#temp1", props:["name"], // props属性 组件标签所有属性的集合 data:function(){ return{ title:"子组件的内容" } }, mounted(){ this.title = this.$props.name; //赋值 把父组件的数据传给子组件 } }; let app = new Vue({ el:"#app", data:{ mes:"父组件的内容" }, components:{ heads:Heads } }); </script>
二、子传父
首先给子组件标签添加ref 属性;在父组件下使用this.$refs 获取子组件标签的相关信息
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <p>{{mes}}</p> <heads ref="aa"></heads>
<!-- 添加ref属性--> </div> </body> </html> <template id="temp1"> <div> <p class="titl">{{title}}</p> </div> </template> <script> let Heads = { template:"#temp1", data:function(){ return{ title:"子组件的内容" } } }; let app = new Vue({ el:"#app", data:{ mes:"父组件的内容" }, components:{ heads:Heads }, mounted(){ this.mes = this.$refs.aa.title;
console.log(this.$refs.aa);//获取子组件标签相关信息 } }); </script>
三、通过事件传值
在子组件下定义一个事件,用于自定义事件。创建的方法是this.$emit 两个参数 :事件名和需要传递的数据
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue.js"></script> </head> <body> <div id="app"> <p>{{msg}}</p> <son @change="fn2" :info="msg"></son>
<!--使用v-on绑定 change->自定义事件名 fn2->方法--> </div> </body> </html> <template id="temp1"> <div> <p @click="fn">{{cont}}</p> </div> </template> <script> let Son = { template:"#temp1", data:function(){ return{ cont:"子组件" } }, props:["info"], methods:{ fn(){ //this.$emit("事件名",数据) this.$emit("change",this.cont = this.$props.info); } } }; let app = new Vue({ el:"#app", data:{ msg:"父组件" }, components:{ son:Son }, methods:{ fn2(res){//接收到的数据 this.msg = res; } } }); </script>
四、动态组件
借助component组件,用于动态切换is属性的值,本质就是切换子组件标签
应用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue.js"></script> <style type="text/css"> * {margin:0;padding:0;list-style:none;} #app {position:relative;width:800px;margin:50px auto 0;border:1px solid #000;} ul {display:flex;} ul li {flex:1;height:40px;line-height:40px;text-align: center;} .cont {position:absolute;left:-1px;top:40px;width:800px;height:400px;line-height:400px;text-align:center;border:1px solid #000;} .on {background:blue;color:#fff;} </style> </head> <body> <div id="app"> <div> <ul> <li v-for="(val,index) of listTitle" @click="change(index)" :class="{on:index==n}">{{val}}</li> </ul> </div> <div> <component v-bind:is="content"> <!--<news></news>--> <!--其实就是切换组件标签--> </component> </div> </div> </body> </html> <template id="news"> <div> <p class="cont">news</p> </div> </template> <template id="foods"> <div> <p class="cont">foods</p> </div> </template> <template id="travel"> <div> <p class="cont">travel</p> </div> </template> <template id="teach"> <div> <p class="cont">teach</p> </div> </template> <script> let News = { template:"#news" }; let Foods = { template:"#foods" }; let Travel = { template:"#travel" }; let Teach = { template:"#teach" }; let app = new Vue({ el:"#app", data:{ listTitle:["新闻","美食","旅游","教育"], content:"news", arr:["news","foods","travel","teach"], n:0 }, components:{ news:News, foods:Foods, travel:Travel, teach:Teach }, methods:{ change(index){ this.n = index; this.content = this.arr[index]; } } }); </script>
路由
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <!--引入Vue和VueRouter插件-->
<script src="js/vue.js"></script> <script src="js/vue-router.js"></script> </head> <body> <div id="app"> <!--模板里添加链接--> <!--默认会被渲染成一个a标签 to为我们自己定义的路由--> <router-link to="/index">首页</router-link> <router-link to="/list">列表页</router-link> <router-link to="/detail">详情页</router-link>
<router-view> <!--路由匹配的组件渲染到这里 存放组件标签--> </router-view> </div> </body> </html> <template id="index"> <div> <p>index</p> </div> </template> <template id="list"> <div> <p>list</p> </div> </template> <template id="detail"> <div> <p>detail</p> </div> </template> <script>
//定义路由组件 let Index = { template:"#index" }; let List = { template:"#list" }; let Detail = { template:"#detail" }; //配置路由 let routs = [ {path:"/index",component:Index}, //每个路由path 对应相应的组件 {path:"/list",component:List}, {path:"/detail",component:Detail} ]; //实例化路由 传入routs配置 let router = new VueRouter({ routes:routs }); let app = new Vue({ el:"#app", router:router //挂载路由 }); </script>
路由参数
定义路由路径的时候,可以指定参数,通过this.$route.params.参数名 获取对应的参数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/vue.js"></script> <script src="js/vue-router.js"></script> </head> <body> <div id="app"> <router-link to="/index/1">首页</router-link> <router-link to="/list">列表页</router-link> <router-link to="/detail">详情页</router-link> <router-view> </router-view> </div> </body> </html> <template id="index"> <div> <p>index</p> </div> </template> <template id="list"> <div> <p>list</p> </div> </template> <template id="detail"> <div> <p>detail</p> </div> </template> <script> let Index = { template:"#index", mounted(){ console.log(this.$route.params.id);
//通过this.$route.params.参数名 获取对应的参数 } }; let List = { template:"#list" }; let Detail = { template:"#detail" }; let routs = [ //定义路由路径的时候,可以指定参数。 {path:"/index/:id",component:Index}, {path:"/list/",component:List}, {path:"/detail/",component:Detail} ]; let router = new VueRouter({ routes:routs }); let app = new Vue({ el:"#app", data:{}, router:router }); </script>
路由嵌套
路由嵌套和普通路由基本一样 在需要嵌套的模板中添加router-link,通过children属性定义子路由
<template id="list"> <div> <p>list</p> <!--嵌套路由--> <router-link to="/list/proa">a</router-link> <router-link to="/list/prob">b</router-link> <router-view> </router-view> </div> </template> //配置路由 let routs = [ {path:"/index",component:Index}, {path:"/list",component:List, children:[ //添加children属性 {path:"/list/proa",component:Proa}, {path:"/list/prob",component:Prob} ] }, {path:"/detail",component:Detail} ];