在vue中,組件之間的通信,是不建議子組件改變父組件的值,因為一個父組件有可能會有很多子組件,改來改去會很難管理(別人都這樣說,我信)
試試:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src='../vue.js'> </script> </head> <body> <div id="app"> <son :son-counter="counter"></son> <p>parent:<input type="text" v-model="counter"/></p> </div> </body> </html> <script> const son={//創建子組件的模板 template:`<div>son:<input v-model="sonCounter" /></div>`, props:['sonCounter'],
//props:{sonCounter:Number/Array/Object/String}...當然我們也可以在子組件中限制,父組件傳過來的值類型 }; var app=new Vue({ el:'#app', data:{ counter:0, }, components:{ son } }); </script>
當我們改變parent這個輸入框中的值時,son對應的輸入框的值,也會發生變化,但是反過來,就不行了。
這是他給我的waring,(英文不好的,可以假裝不懂,),只知道有個錯。
換個方法試試:
這里不具體講解組件的創建了。
具體思路:
1)在子組件中觸發事件,將事件派送給父組件,然后父組件來監聽。
2)父組件監聽事件,改變值。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="../vue.js"></script> </head> <body> <div id="app"> <my-component @inc="increment" :counter='counter'></my-component> <p>{{counter}}</p> </div> </body> </html> <script>
//全局注冊一個組件 Vue.component("my-component",{ template:'<div>this is son component <button @click="inc">增加</button> </br><span>{{counter}}</span></div>', props:["counter"],//子組件的props屬性一般用於接收父組件的值 methods:{ inc:function(){ this.$emit("inc");//$emit的作用就是將事件進行向上派發 } } }); var app=new Vue({ el:"#app",//指定掛載元素 data:{ counter:0, }, methods:{ increment(){ this.counter++; } } }); </script>
本質上是子組件通過觸發一個事件,父組件監聽這個事件,然后做出相應的變化。