Vue.js利用額外的vue instance處理組件事件及資料
by cactus77kiki
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js"></script>
<div id="vapp">
【利用額外的vue instance處理組件事件及資料】
(範例:組件1利用傳入之Function將值傳給父組件加工,而不由組件內處理)
<h3>component1(將組件內事件丟回給父層處理。而父層轉手由額外的vue instance統一處理)</h3>
<ele-one :selected = "selected1" :valuedeliver="set_comp_one"></ele-one>
<h3>component2</h3>
<ele-two :selected = "selected2" :type="selectedtype"></ele-two>
</div>
JavaScript
var comper = new Vue({
data:{
selected_one: "",
selected_two: "",
selected_type:""
},
methods:{
setonevalue: function(param){ //param:objec
//改變ele-one 資料
this.selected_one = param.id;
this.selected_type = param.kind;
},
settwovalue: function(param){ //param:value
this.selected_two = param;
}
}
});
Vue.component('ele-one',{
props:{
selected:{type: Number},
valuedeliver:{type: Function}
},
template:`<div><div v-for="(l,index) in list">
<label><input type="radio" :value="l.id" v-model="selection" @change="changer(l)">
{{l.text}}</label>
</div></div>`,
data:function(){
return{
selection: this.selected,
list: []
}
},
methods:{
getData: function(){
var data =
[{id: 1, text:'前端', kind:'A'},{id: 2, text:'後端', kind:'B'},{id: 3, text:'資料庫', kind:'C'}];
this.list = data;
},
changer: function(param){
this.valuedeliver(param);
}
},
created:function(){
this.getData();
}
});
Vue.component('ele-two',{
props:{
type:{type:String},
selected:{type:Number}
},
template:`<div>
<div v-for="(l,index) in list">
<label><input type="radio" :value="l.id" v-model="selection">
{{l.text}}</label>
</div>
</div>`,
data: function(){
return {
typing: this.type,
selection: this.selected,
datalist: [],
//list: []
}
},
watch:{
type: {
handler: function (value) {
this.typing = value; //當父組件type值更新時、子組件主動更新typing
},
deep: true //若props1為物件時使用深度監控
},
},
computed:{
list: function(){
var list = this.datalist;
var value = this.typing;
var arry = list.filter(function(item){
return item.kind == value;
});
return arry;
}
},
methods:{
allData: function(){
var data =
...