父→子传值
父组件以属性的形式绑定值到子组件身上(传)
子组件通过使用属性props接收(收)
props是单向绑定的(只读属性):
当父组件的属性变化时,将传导给子组件,但是反过来不会
props属性支持两种常见的写法形式
数组(推荐)
优点:书写简单
缺点:不能设置默认值、数据类型
对象
优点:可以设置数据默认值与数据类型
缺点:写法复杂
实例
<div id="app"> <child :day="day" :time="time"></child> </div> <script src="./js/vue.js"></script> <script> Vue.component("child", { // 数组写法 // props: ["day", "time"], // 对象写法 props: { day: { default: "八", //如果没传,则使用默认值 type: String, }, time: { default: "1970-01-01 00:00:00", type: String, }, }, template: `<div>今天是星期{{day}},当前时间是:{{time}}</div>`, created() { console.log(this.day); console.log(this.time); // this.day = "六"; // 千万别这么写,千万别这么写,千万别这么写 }, }); new Vue({ el: "#app", data: { day: "五", time: "2020-12-11 10:27:48", }, }); </script>
子→父传值
子组件模版
内容中用$emit()
定义自定义事件
,$emit()
方法至少有2个参数
第一个参数为自定义的事件名称(不要和内置的事件重名,例如click、change等)abc
第二个参数为需要传递的数据(可选,如果传可以是任何格式的数据)
父组件模板
内容中的子组件占位标签上用v-on(或@)绑定子组件定义的自定义事件名,监听子组件的事件,实现通信
实例
<div id="app"> <!-- 监听子组件 bianda事件 点击进行bigger方法--> <child @bianda="bigger"></child> <div :style="{fontSize: fontSize + 'px',color: color}">{{msg}}</div> </div> <script src="./js/vue.js"></script> <script> // 定义全局组件用于当子组件 Vue.component("child", { data: function () { return { size: 11, color: "red", }; }, template: `<div><button @click="$emit('bianda',size,color)">点我给父组件中的文字加{{size}}像素</button></div>`, }); new Vue({ el: "#app", data: { msg: "黑色星期五", fontSize: 23, color: "black", }, methods: { bigger: function (size, color) { this.fontSize += size; this.color = color; }, }, }); </script>
EventBus 中央事件总线
在Vue中通过单独的事件中心
来管理非父子关系
组件(兄弟)间的通信
核心步骤
建立事件中心
const eventBus = new Vue()
传递数据
eventBus.$emit('自定义事件名',传递的数据)
接收数据
eventBus.$on('自定义事件名'[,callback])
销毁事件中心
eventBus.$off('自定义事件名')
实例
<div id="app"> <laoma></laoma> <hr /> <laowang></laowang> <hr /> <button @click="gg">离开游戏</button> </div> <script src="./js/vue.js"></script> <script> // 事件中心 const eventBus = new Vue(); // 人物:老马 Vue.component("laoma", { data: function () { return { hp: 100, // 老马的血量 time:1, //老马的复活次数 damage: 8, // 老马的武力值 }; }, template: `<div> <div>老马(心悦会员3级)当前的hp是:{{hp}}</div> <button @click="wlb">发动闪电五连鞭</button> </div>`, methods: { // 技能:五连鞭 wlb: function () { eventBus.$emit("mbg", this.damage); }, }, created() { eventBus.$on("gdl", (val) => { if (this.hp - val < 0) { if(this.time){ alert("老马冲钱, 满血复活!"); this.hp = 100; this.time-=1; }else{ this.hp = 0; alert("Game over!老王获胜!"); } } else { this.hp -= val; } }); }, }); // 人物:老王 Vue.component("laowang", { data: function () { return { hp: 100, // 老王的血量 damage: 12, // 老王的武力值 }; }, template: `<div> <div>老王当前的hp是:{{hp}}</div> <button @click="cqj">发动大力出奇迹</button> </div>`, created() { // 让老王自己拿本本记录hp的扣减情况 eventBus.$on("mbg", (val) => { if (this.hp - val < 0) { this.hp = 0; alert("Game over!老马获胜!"); } else { this.hp -= val; } }); }, methods: { cqj: function () { eventBus.$emit("gdl", this.damage); }, }, }); new Vue({ el: "#app", data: {}, methods: { gg: function () { eventBus.$off("mbg"); eventBus.$off("gdl"); }, }, }); </script>
ref(子→父)(了解)
ref
属性被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的 $refs
对象上。
如果在普通的 DOM 元素上使用ref
属性,则引用指向的就是 DOM 元素;
如果ref
属性用在子组件上,引用就指向子组件实例。
原理:
在父组件中通过ref
属性(会被注册到父组件的$refs
对象上)拿到组件/DOM对象,
从而得到组件/DOM中的所有的信息,也包括值
实例
<div id="app"> <div ref="cc">今天天气很好</div> <child ref="cd"></child> </div> <script src="./js/vue.js"></script> <script> Vue.component('child',{ data: function () { return { msg: "33℃" } }, template: `<div>温度:{{msg}}</div>` }) new Vue({ el: "#app", data: { }, mounted() { // 可以 为所欲为 console.log(this.$refs.cc); // 获取dom对象 console.log(this.$refs.cd); // 获取vue组件实例(权限比较大,谨慎啊) }, }) </script>
Comments | NOTHING