vue组件传值和路由——day04
1、组件传值
1.父组件向子组件传值
<script>
var vm = new Vue({
el: '#app',
data: {
msg: '父组件'
},
components: {
son: {
template: '<h1>子组件 --- {{finfo}}</h1>',
props: ['finfo'] // 把父组件传递过来的 finfo 属性,先在 props 数组中,定义一下,这 样,才能使用这个数据
}
}
});
</script>
注意:先使用props定义一下才能使用,props 中的数据,都是只读的,无法重新赋值
2. 使用v-bind
或简化指令,将数据传递到子组件中:
<div id="app">
<son :finfo="msg"></son>
</div>
2.子组件向父组件传值
原理:父组件将方法的引用,传递到子组件内部,子组件在内部调用父组件传递过来的方法,同时把要发送给父组件的数据,在调用方法的时候当作参数传递进去;
<son @func="getMsg"></son>
子组件内部通过this.$emit('方法名', 要传递的数据)
方式,来调用父组件中的方法,同时把数据传递给父组件使用
<div id="app">
<!-- 引用父组件 -->
<son @func="getMsg"></son>
<!-- 组件模板定义 -->
<script type="x-template" id="son">
<div>
<input type="button" value="向父组件传值" @click="sendMsg" />
</div>
</script>
</div>
<script>
// 子组件的定义方式
Vue.component('son', {
template: '#son', // 组件模板Id
methods: {
sendMsg() { // 按钮的点击事件
this.$emit('func', 'OK'); // 调用父组件传递过来的方法,同时把数据传递出去
}
}
});
var vm = new Vue({
el: '#app',
data: {},
methods: {
getMsg(val){ // 子组件中,通过 this.$emit() 实际调用的方法,在此进行定义
alert(val);
}
}
});
</script>
2、路由
**后端路由:**对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;
**前端路由:**对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现;
在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由);
1.路由基本使用
1.1先引入vue-router组件库,注意vue包先引入,vue-router是依赖于vue的。
<script src="./lib/vue-2.4.0.js"></script>
<script src="./lib/vue-router-3.0.1.js"></script>
1.2创建vm实例
var vm = new Vue({
el:'#app',
data:{},
methods:{},
router:routerObj
})
vm实例中,使用 router 属性来使用路由规则
1.3创建路由对象
var routerObj = new VueRouter({
routes:[
{path:'/',redirect:'/login'},
{path:'/login',component:login},
{path:'/register',component:register}
]
})
路由对象中参数解释:
routes[]——路由匹配规则
path——表示监听 哪个路由链接地址
component——如果 路由是前面匹配到的 path ,则展示 component 属性对应的那个组件
注意: component 的属性值,必须是一个 组件的模板对象, 不能是 组件的引用名称
redirect——重定向
1.4定义两个路由组件
var login = {
template:'<h1>登录组件</h1>'
}
var register={
template:'<h1>注册组件</h1>'
}
1.5使用router-view来显示匹配到的组件
<div id="app">
<a href="#/login">登录</a>
<a href="#/register">注册</a>
<router-link to="/login"></router-link>
<router-link to="/register"></router-link>
<!-- router-view相当于占位符 -->
<router-view></router-view>
</div>
2.路由的嵌套
使用children实现路由的嵌套
//创建一个路由对象
//在new路由对象的时候可以为构造函数,传递一个配置对象
var router= new VueRouter({
routes:[ //路由匹配规则
{
path:'/com',
component:com,
children:[
{path:'login',component:login},
{path:'register',component:register}
]
},
]
})
使用 children 属性,实现子路由,同时,子路由的 path 前面,不要带 / ,否则永远以根路径开始请求,这样不方便我们用户去理解URL地址
<div id="app">
<router-link to="/account">Account</router-link>
<router-view></router-view>
</div>
<template id="com">
<div>
<h1>这是一个account组件</h1>
<router-link to="/com/login">登录</router-link>
<router-link to="/com/register">注册</router-link>
<router-view></router-view>
</div>
</template>