1.组件内部通过props接收传递过来的值
2.父组件通过属性将值传递给子组件
<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.子组件通过自定义事件向父组件传递信息
<button @click='$emit("enlarge-text",5)'>扩大父组件中内容的字体大小</button>
2.父组件监听子组件的事件
<menu-item :msg='msg' @enlarge-text='handel($event)'></menu-item>
$emit()
触发事件$emit()
第一个参数为 自定义的事件名称 第二个参数为需要传递的数据<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.单独的事件中心管理组件间的通信
var hub = new Vue();
2.监听事件与销毁事件
hub.$on('jerry-event', jerryEvent)
hub.$off('jerry-event');
<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>