一堆问题。

来源:3-10 Vue的组件之高级属性

qq_缺南摸了个北_0

2019-02-16

根 Vue 提供的 provide 函数

provide() {
    console.log('provide')
    const data = {}
    Object.defineProperty(data, 'value', {
      get: () => this.value, // 为什么使用箭头函数就可以解决递归调用了?
      enumerable: true
    })
    Object.defineProperty(data, 'test', {
      get: () => this.test,
      enumerable: true
    })
    return {
      yeye: this,
      // value: this.value,
      data: data,
      // value2: '呵呵'
    }
  }

在根模板里绑定的是 $options.data.value

 data: {
    value: '',
    test: ''
  },
 <input v-model="value" /> 

provide里定义的 const data ={} 和 根模板里定义的 $options.data 有什么联系吗?它们两个难道不是不同的对象吗?

为什么我在跟模板里明明修改的是 $options.data 的数据,在 provide通过 const data 传递给子组件的 inject .data 也会跟着改变呢?

写回答

3回答

Jokcy

2019-02-18

因为你在provider里面定义data的set和get的时候,你修改的是`this.value`,也就是说修改的是`$options.data.value`,所以会造成双向绑定的效果。你在修改msg和value的时候,因为他们是非双向绑定的,所以如果某个时候你的父组件主动修改了provider里面的数据,那么会覆盖你在子组件中进行的修改,这也是vue给出提醒的原因。

0
0

Jokcy

2019-02-17

能在https://codesandbox.io 这里创建一个demo么,你这么描述不是很很懂你想表达什么问题,你在这里写一个能展示你的问题的demo然后说一下你期望的输出以及demo实际的输出,就可以很好得帮你解决问题了。

0
1
qq_缺南摸了个北_0
https://codesandbox.io/s/4wl54yzn2x demo的链接在这里。
2019-02-18
共1条回复

qq_缺南摸了个北_0

提问者

2019-02-16

难道它俩表示的是同一个 data ? 所以故意取名为 const data ?

0
1
qq_缺南摸了个北_0
那明明定义在 $options.data 里的 所有属性都使用 Object.defineProperty 定义过并实现了 reactivity。 为什么一开始不支持双向绑定,非要在重新定义一次呢?
2019-02-16
共1条回复

Vue核心技术 Vue+Vue-Router+Vuex+SSR实战精讲

深入讲解Vue核心技术,展示Vue应用开发中的各种问题和解决方案

3168 学习 · 853 问题

查看课程