在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 如何理解Vue應用是 prop 向下傳遞 事件向上傳遞的

如何理解Vue應用是 prop 向下傳遞 事件向上傳遞的

如何理解Vue應用是 prop 向下傳遞 事件向上傳遞的

官方文檔如是說,也有官方代碼實例如下:
反例1

Vue.component('TodoItem', {
  props: {
    todo: {
      type: Object,
      required: true
    }
  },
  template: '<input v-model="todo.text">'
})

反例2

Vue.component('TodoItem', {
  props: {
    todo: {
      type: Object,
      required: true
    }
  },
  methods: {
    removeTodo () {
      var vm = this
      vm.$parent.todos = vm.$parent.todos.filter(function (todo) {
        return todo.id !== vm.todo.id
      })
    }
  },
  template: `
    <span>
      {{ todo.text }}
      <button @click="removeTodo">
        X
      </button>
    </span>
  `
})

正例1

Vue.component('TodoItem', {
  props: {
    todo: {
      type: Object,
      required: true
    }
  },
  template: `
    <input
      :value="todo.text"
      @input="$emit('input', $event.target.value)"
    >
  `
})

正例2

Vue.component('TodoItem', {
  props: {
    todo: {
      type: Object,
      required: true
    }
  },
  template: `
    <span>
      {{ todo.text }}
      <button @click="$emit('delete')">
        X
      </button>
    </span>
  `
})

網(wǎng)上還是挺多這種例子,但大多數(shù)是代碼,不是太理解..因此在這里向大家求教.

回答
編輯回答
莓森

其實題主并沒有說清楚你的問題……不過我想我大概能猜到,所以答一下吧。

其實這是面向對象(Vue 的組件化也類似)中很常見的一個問題:實例之間如何傳遞狀態(tài)。即 A 中如果要用 B,怎么來回傳遞一些值。A 里面直接寫 B.foo = 'bar' 倒也容易,那么 B 如何傳回去呢?

真正的難點在于如何保證每個類可被復用。比如上面反例2。它直接修改父組件的屬性,那么就要求:

  1. 必須有父組件
  2. 父組件必須有對應的屬性
  3. 父組件對應的屬性的類型必須符合子組件的要求(本例中是數(shù)組)

僅僅一個 todo-list 的小應用看起來還好,但是在大產(chǎn)品中,如果每個類都跟其它類有如此緊密的耦合,那簡直就無法維護和測試。所以現(xiàn)在大家普遍采用的辦法就是:

  1. 因為父組件知道子組件,所以父組件可以直接操作子組件
  2. 子組件通過事件通知父組件采取某個操作

反例1中,Vue 采用隱式數(shù)據(jù)雙向綁定,即使用 getter/setter 替換直接的賦值操作。所以 v-model 做法會直接修改父組件的變量,也會很大程度上導致組件間強耦合,所以也建議盡量避免。

2017年12月6日 21:33