关于props 和 事件的几个问题。

来源:3-9 Vue的组件之自定义双向绑定

qq_缺南摸了个北_0

2019-06-20

<body>
  <div id='app'>
    {{valueFromParent}}
    <comp-one :value-from-parent='valueFromParent' @input='handlerInput'></comp-one>
  </div>
</body>
<script>
  const CompOne = {
    props:['valueFromParent'],
    template: `<div>
        <input type='text' :value='valueFromParent' @input='handlerInput' />
      </div>`,
    methods: {
      handlerInput (e) {
        this.$emit('input', e.target.value)
      }
    },
  }

  var app = new Vue({
    el: '#app',
    data: {
      valueFromParent: '来自父组件的数据'
    },
    methods: {
      handlerInput (newVal) {
        this.valueFromParent = newVal
      }
    },
    components: {
      CompOne
    },
  })
</script>

有几个疑问:

  • props 可以理解成在标签级别传递给组件的一些(外来数据),就和在HTML标签上写data-xxx其实是一样的。如果传递的是v-bind形式,那么正好就和父组件产生联系了。如果传递的是单纯的字符串格式,其实也父组件也没多大关系。
<div data-id="1"></div> <comp-one data-id='1'></comp-one>
  • 事件由compone触发,也由compone监听。也就是说事件的监听和触发都是由同一个对象完成的。Vue肯定在prototype上实现了 $on $emit 这两个实例方法。并在内部实现了监听触发机制。而提供事件监听方法,正好在它的父组件内部定义,于是就建立了父子组件之间通信的通道了。
<comp-one :value-from-parent='valueFromParent' @input='handlerInput'></comp-one>
// 就和在普通的HTML元素上的事件也是由元素本身监听一样。
<button @click='hanlderClick'></button>
  • 组件间的 v-model.

我看这个例子,

  1. 首先使用 props,将父组件的数据传递给子组件。
  2. 子组件中的input利用 :value 绑定了一下这个传递过来的数据,仅仅只是展示了一下。
  3. 后续 input 的修改实现组件间的 v-model 仍然还是利用事件机制。
  4. 父组件提供事件响应方法,并在其内部调用 this.valueFromParent=arguments[0]. 基于dataObject.defineProperty 代理了,所以也就完成了自生的显示的变化。
写回答

1回答

Jokcy

2019-06-20

所以。。。同学你的问题是啥?

0
2
Jokcy
回复
qq_缺南摸了个北_0
v-model确实就是帮你封装来事件,他监听的是input事件,文档其实说得还是比较明确的
2019-06-21
共2条回复

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

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

3168 学习 · 853 问题

查看课程