Vue组件&组件通信

组件:
一个组件可以Fenwick数据(model)和视图(view),数据更新时,视图也会自动更新,在视图中绑定一些事件,它们可以触发methods里指定的方法,从而改变数据、更新视图,这是一个组件的基本运行模式。

Vue组件是单项数据流,无法从组件内部直接修改prop value值,解决方法:给组件声明一个data,默认引用value的值,然后在组件内部维护这个data。

组件通信:
组件不仅可以把模板的内容进行复用,更重要的是组件间进行通信。

1. 父组件向子组件传递内容

父组件的模板中包含子组件,父组件要正向的向子组件传递数据或参数,子组件接收到后根据参数的不同来渲染不同的内容或执行操作。这个正向传递数据的过程就是通过props实现的。
组件中使用props来声明需要从父组件接收的数据,props的值有两种,一种是字符串数组,一种是对象。

比如构造一个数组接受一个来自父组件的数据message,并把它在组建模板中渲染,如下:

<div

Vue2.x与Vue1.x比较大的一个改变是,Vue2.x通过props传递数据是单向的,即父组件变化时,会传递给子组件,但反过来不行。而Vue1.x里提供了.sync修饰符来支持双向绑定。

2.子组件向父组件传递数据

当子组件需要向父组件传递数据时,就需要用到自定义事件。v-on除了监听DOM事件外,还以可以用于组件之间的自定义事件。子组件用 e m i t ( ) on()来监听子组件。
父组件也可以直接在子组件的自定义标签上使用v-on来监听子组件触发的自定义事件。

3.非父子组件通信
非父子组件一般有两种,兄弟组件,跨多级组件。

在Vue.x中,除了 e m i t ( ) dispatch()和$broadcast()这两个方法。

  • $dispatch()

$dispatch()用于向上级派发事件,只要时他的父级(一级或多级以上),都可以在Vue实例的event选项内接收。

  • $broadcast()

$broadcast()是由上级向下级广播事件。

这两个方法一旦接收后,任何组件都可以接收到的,就近原则,而且会在第一次接收后停止冒泡。除非返回true。
但是,这连个方法都在Vue2.x中废弃了,因为基于组建树结构的事件流发放你是让人难以理解。并且在组件节后扩展的过程中会变得越来越脆弱,并且不能解决兄弟组件通信问题。

在Vue2.x中推荐使用一个空的Vue实例作为中央事件总线(bus)。

4.父链与子组件索引

除总线bus外,还有两种实现组件间通信的方法:父链和子组件索引。

  • 父链

在子组件中使用this. p a r e n t 访 t h i s . children访问它所有的子组件,而且可以递归向上或向下无限访问,知道根实例或最内层的组件。
应当尽量避免子组件依赖父组件的数据,更不应该去主动修改父组件数据,因为这样使得父子组件紧耦合,很难理解父组件的状态,理想情况下,只有组件自己能够修改它的状态。父子组件最好还是通过props和$emit来通信。

  • 子组件索引

当子组件较多时,通过特殊的属性ref来为子组件指定一个索引名称,提供了子组件索引的方法。在父组件模板中,子组件标签上使用ref指定一个名称,并在父组件内通过this. r e f s 访 refs只在组件渲染完成后才填充,并且它是非响应式的。仅作为一个直接访问子组件的应急方案,应避免在模板中或计算机属性中使用$refs。

5.其他
组件的template的内容冗长,复杂,因此Vue提供一种定义模板的方式:在标签里使用text/x-template类型,并且指定一个id,将这个id赋给template。

描述:手动挂载实例
Vue.extend是基础的Vue构造器,创建一个“子类”,参数是一个包含组件选项的对象。
如果Vue实例在实例化时没有收到el选项,它就处于“未挂载”状态,没有关联的DOM元素。
可以使用$mount()手动的挂载一个未挂载的实例。这方法返回实例本身,因而可以链式调用其它实例方法。
手动挂载实例(组件)几乎用不到,只有在开发一些复杂的独立组件时可能会使用,了解。

猜你喜欢

转载自blog.csdn.net/leng_nuan/article/details/80579831