Vue组件之间传值
1.Vue组件之间传值
1.1父组件向子组件传值
1.组件内部通过props接收传递过来的值

2.父组件通过属性将值传递给子组件

-
父组件发送的形式是以属性的形式绑定值到子组件身上。
-
然后子组件用属性props接收
-
在props中使用驼峰形式,模板中需要使用短横线的形式字符串形式的模板中没有这个限制
<div id="app"> <div>{{pmsg}}</div> <!--1、menu-item 在 APP中嵌套着 故 menu-item 为 子组件 --> <!-- 给子组件传入一个静态的值 --> <menu-item title='来自父组件的值'></menu-item> <!-- 2、 需要动态的数据的时候 需要属性绑定的形式设置 此时 ptitle 来自父组件data 中的数据 . 传的值可以是数字、对象、数组等等 --> <menu-item :title='ptitle' content='hello'></menu-item> </div> <script type="text/javascript"> Vue.component('menu-item', { // 3、 子组件用属性props接收父组件传递过来的数据 props: ['title', 'content'], data: function() { return { msg: '子组件本身的数据' } }, template: '<div>{{msg + "----" + title + "-----" + content}}</div>' }); var vm = new Vue({ el: '#app', data: { pmsg: '父组件中内容', ptitle: '动态绑定属性' } }); </script>
3.props属性名规则
在props中使用驼峰形式,模板中需要使用短横线的形式
字符串形式的模板中没有这个限制

<body>
<div id="app">
<!-- <div>{{msg}}</div> -->
<!-- <menu-item title="来自父组件中的内容"></menu-item> -->
<!-- 在props中使用驼峰形式,模板中需要使用短横线的形式 -->
<menu-item :menu-Item='emsg'></menu-item>
</div>
<script src="vue.js"></script>
<script>
Vue.component('third-item', {
props: ['textItem'],
template: '<div>{{textItem}}</div>'
});
Vue.component('menu-item', {
props: ['menuItem'],
// 字符串形式的模板中没有这个限制
template: '<div>{{menuItem}}<third-item textItem="hello"></third-item></div>'
});
var vm = new Vue({
el: '#app',
data: {
msg: '父组件',
emsg: '我是动态绑定属性',
pmsg: 'abc'
},
methods: {
}
})
</script>
</body>
1.2子组件向父组件传值
1.子组件通过自定义事件向父组件传递信息
<button @click='$emit("enlarge-text",5)'>扩大父组件中内容的字体大小</button>
2.父组件监听子组件的事件
<menu-item :msg='msg' @enlarge-text='handel($event)'></menu-item>
-
子组件用
$emit()触发事件 -
$emit()第一个参数为 自定义的事件名称 第二个参数为需要传递的数据 -
父组件用v-on 监听子组件的事件
<body>
<div id="app">
<div :style='{fontSize: fontSize + "px"}'>{{msg}}</div>
<!-- 2 父组件用v-on 监听子组件的事件
这里 enlarge-text 是从 $emit 中的第一个参数对应 handle 为对应的事件处理函数
-->
<menu-item :msg='msg' @enlarge-text='handel($event)'></menu-item>
</div>
<script src="vue.js"></script>
<script>
/*
子组件向父组件传值-携带参数
*/
Vue.component('menu-item', {
props: [],
/*
1、子组件用$emit()触发事件
第一个参数为 自定义的事件名称 第二个参数为需要传递的数据
*/
template: `
<div>
<button @click='$emit("enlarge-text",5)'>扩大父组件中内容的字体大小</button>
<button @click='$emit("enlarge-text",12)'>扩大父组件中内容的字体大小</button>
</div>
`
})
var vm = new Vue({
el: '#app',
data: {
msg: '父组件中的内容',
fontSize: 10
},
methods: {
handel: function (val) {
// 扩大字体大小
this.fontSize += val;
}
}
})
</script>
</body>
1.3非父子组件间传值-兄弟之间的传递
1.单独的事件中心管理组件间的通信
var hub = new Vue();
2.监听事件与销毁事件
hub.$on('jerry-event', jerryEvent)
hub.$off('jerry-event');

-
兄弟之间传递数据需要借助于事件中心,通过事件中心传递数据
-
提供事件中心 var hub = new Vue()
-
-
传递数据方,通过一个事件触发hub.$emit(方法名,传递的数据)
-
接收数据方,通过mounted(){} 钩子中 触发hub.$on()方法名
-
销毁事件 通过hub.$off()方法名销毁之后无法进行传递数据
<body>
<div id="app">
<div>{{msg}}</div>
<div>
<button v-on:click="handel">销毁事件</button>
</div>
<tom-item></tom-item>
<jerry-item></jerry-item>
</div>
<script src="vue.js"></script>
<script>
/* 兄弟组件之间的传递 */
//1、 提供事件中心
var hub = new Vue();
Vue.component("tom-item", {
data: function () {
return {
num: 0
}
},
template: `
<div>
<span>Tom:{{num}}</span>
<div>
<button @click='handel'>点击</button>
</div>
</div>
`,
methods: {
handel: function () {
//2、传递数据方,通过一个事件触发hub.$emit(方法名,传递的数据) 触发兄弟组件的事件
hub.$emit('jerry-event', 1);
}
},
mounted: function () {
// 3、接收数据方,通过mounted(){} 钩子中 触发hub.$on()方法名
hub.$on('tom-event', (val) => {
this.num += val;
})
}
});
Vue.component("jerry-item", {
data: function () {
return {
num: 0
}
},
template: `
<div>
<span>Jerry:{{num}}</span>
<div>
<button @click='handel'>点击</button>
</div>
</div>
`,
methods: {
handel: function () {
hub.$emit('tom-event', 2)
}
},
mounted: function () {
// 监听事件
hub.$on('jerry-event', (val) => {
this.num += val;
})
}
});
var vm = new Vue({
el: '#app',
data: {
msg: '父组件'
},
methods: {
handel: function () {
//4、销毁事件 通过hub.$off()方法名销毁之后无法进行传递数据
hub.$off('tom-event');
hub.$off('jerry-event');
}
}
})
</script>
</body>

浙公网安备 33010602011771号