1. 程式人生 > >vue中子父、父子之間傳參+雙向傳參

vue中子父、父子之間傳參+雙向傳參

子父傳參

vue1.0中 vm.$dispatch 和 vm.$broadcast 被棄用,改用$emit,$on

vm.$on( event, callback )

監聽當前例項上的自定義事件。事件可以由vm.$emit觸發。回撥函式會接收所有傳入事件觸發函式的額外引數。

vm.$emit( event, […args] )

觸發當前例項上的事件。附加引數都會傳給監聽器回撥。

例子:

//父元件
<template>
    <ratingselect @select-type="onSelectType"></ratingselect>
</template>
<script
>
data () { return { selectType: 0, }, methods: { onSelectType (type) { this.selectType = type } } </script>

父元件使用@select-type="onSelectType"監聽由子元件vm.$emit觸發的事件,通過onSelectType()接受從子元件傳遞過來的資料,通知父元件資料改變了。

// 子元件
<template>
  <div>
    <span
@click="select(0, $event)" :class="{'active': selectType===0}">
</span> <span @click="select(1, $event)" :class="{'active': selectType===1}"></span> <span @click="select(2, $event)" :class="{'active': selectType===2}"></span> </div> </template> <script
>
data () { return { selectType: 0, }, methods: { select (type, event) { this.selectType = type this.$emit('select-type', type) } } </script>

子元件通過$emit來觸發事件,將引數傳遞出去。

父子傳參

轉自:https://www.cnblogs.com/ygtq-island/p/6864477.html

先定義一個子元件,在元件中註冊props

12345678910111213<template><div><div>{{message}}(子元件)</div></div></template><script>export default {props: {message: String  //定義傳值的型別<br>    }}</script><style></style>

在父元件中,引入子元件,並傳入子元件內需要的值

1234567891011121314151617181920212223<template><div><div>父元件</div><child :message="parentMsg"></child>  </div></template><script>import child from './child'  //引入child元件export default {data() {return {parentMsg: 'a message from parent'  //在data中定義需要傳入的值}},components: {child}}</script><style></style>

這種方式只能由父向子傳遞,子元件不能更新父元件內的data

在元件上使用v-model(雙向傳參)

來自官網上的解釋:

自定義事件可以用於建立支援v-model的自定義輸入元件。

但是首先我們得記住之前的v-model的解釋,也就是

<input v-model="searchText">

等價於

<custominput 
v-bind:value="searchText"
v-on:input="searchText=$event">
</custominput>

為了能夠使它正常工作,這個元件內的<input>必須:1、將其value特性繫結到一個名為value的prop上; 2

在其input事件被出發的時候,將新的值通過自定義的input時間丟擲!

故要寫出如下程式碼:

Vue.component('custom-input',{
    props:['value'],
    template:`
    <input v-bind:value="value"
    v-on:input="$emit('input',$event.target.value)">
    `
})

現在v-model就可以在元件上完美地工作起來

<custom-inpu v-model="searchText"></custome-input>

下面來一個朋友應用的例子:

自定義元件sidebar,要實現

<sidebar v-model="active"></sidebar>

父元件滿足條件:data裡面要有active元素

子元件滿足條件:1、類似於父子單向傳參,子元件中要有props名為value

2、類似於子父傳參,(在子元件中設定active資料(只是個人用)),在子元件中進行監聽

引數傳入: value(val) {

if(val) {

this.active = val console.log("val") console.log(val) } }, 引數傳出: active(val) { this.$emit('input', val) }

嘻嘻嘻可以在正常使用啦,以後再用還會進行其他優化