vue组件事件

1.双向绑定及指令

v-bind:可省v-on:@的缩写 

Vue.js为最常用的两个指令v-bindv-on提供了缩写方式。v-bind指令可以缩写为一个冒号,v-on指令可以缩写为@符号。

<!--完整语法--><a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a><!--缩写语法--><a href="javascripit:void(0)" :class="activeNumber=== n + 1 ? 'active' : ''">{{ n + 1 }}</a>

<!--完整语法--><button v-on:click="greet">Greet</button><!--缩写语法--><button @click="greet">Greet</button>

2. 组件

1.组件:提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树:

那么什么是组件呢?
组件可以扩展HTML元素,封装可重用的HTML代码,我们可以将组件看作自定义的HTML元素。

2.组件的创建和注册

Vue.js的组件的使用有3个步骤:创建组件构造器、注册组件和使用组件。

理解组件的创建和注册

我们用以下几个步骤来理解组件的创建和注册:

1. Vue.extend()Vue构造器的扩展,调用Vue.extend()创建的是一个组件构造器。 
2. Vue.extend()构造器有一个选项对象,选项对象的template属性用于定义组件要渲染的HTML。 
3. 使用Vue.component()注册组件时,需要提供2个参数,第1个参数时组件的标签,第2个参数是组件构造器。 
4. 组件应该挂载到某个Vue实例下,否则它不会生效。

<!DOCTYPE html>

<html>

<body>

<div id="app">

<!-- 3. #app是Vue实例挂载的元素,应该在挂载元素范围内使用组件-->

<my-component></my-component>

</div>

</body>

<script src="js/vue.js"></script>

<script>

 

// 1.创建一个组件构造器

var myComponent = Vue.extend({

template: '<div>This is my first component!</div>'

})

 

// 2.注册组件,并指定组件的标签,组件的HTML标签为<my-component>

Vue.component('my-component', myComponent)

 

new Vue({

el: '#app'

});

 

</script>

</html>

全局注册和局部注册

调用Vue.component()注册组件时,组件的注册是全局的,这意味着该组件可以在任意Vue示例下使用。
如果不需要全局注册,或者是让组件使用在其它组件内,可以用选项对象的components属性实现局部注册。

父组件和子组件

组件注册语法糖

以上组件注册的方式有些繁琐,Vue.js为了简化这个过程,提供了注册语法糖。

使用Vue.component()直接创建和注册组件:

Vue.component()的第1个参数是标签名称,第2个参数是一个选项对象,使用选项对象的template属性定义组件模板。
使用这种方式,Vue在背后会自动地调用Vue.extend()

 

使用script或template标签

template选项中拼接HTML元素比较麻烦,这也导致了HTMLJavaScript的高耦合性。
庆幸的是,Vue.js提供了两种方式将定义在JavaScript中的HTML模板分离出来。

组件的el和data选项

使用props父传子组件实例的作用域是孤立的。这意味着不能并且不应该在子组件的模板内直接引用父组件的数据。可以使用 props 把数据传给子组件。

<child-component v-bind:子组件prop="父组件数据属性"></child-component>

双向绑定

可以使用.sync显式地指定双向绑定,这使得子组件的数据修改会回传给父组件。

<my-component v-bind:my-name.sync="name" v-bind:my-age.sync="age"></my-component>

单次绑定

可以使用.once显式地指定单次绑定,单次绑定在建立之后不会同步之后的变化,这意味着即使父组件修改了数据,也不会传导给子组件。

<my-component v-bind:my-name.once="name" v-bind:my-age.once="age"></my-component>

1. prop验证

props: {data: Array,columns: Array,filterKey: String}

这段代码表示:父组件传递过来的data和columns必须是Array类型,filterKey必须是字符串类型。
更多prop验证的介绍,请参考:官方文档prop验证

2. filterBy过滤器

可以根据指定的字符串过滤数据。

3. slot插槽和父子组件之间的访问和通信

组件的API主要来源于以下三部分:

  • prop 允许外部环境传递数据给组件;
  • 事件 允许组件触发外部环境的 action;
  • slot 允许外部环境插入内容到组件的视图结构内

https://www.cnblogs.com/keepfool/p/5637834.html

1.slot是一个非常有用的东西,它相当于一个内容插槽,它是我们重用组件的基础。Vue的事件系统独立于原生的DOM事件,它用于组件之间的通信。<slot>元素是一个内容插槽组件的编译作用域

  • 在组件template中使用<slot>标签作为内容插槽
  • 使用$children, $refs, $parent 实现父子组件之间的实例访问
  • 在子组件中,使用$dispatch向父组件派发事件;在父组件中,使用$broadcast向子组件传播事件
  • 结合这些基础知识,我们一步一步实现一个CURD的示例

父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译

通俗地讲,在子组件中定义的数据,只能用在子组件的模板。在父组件中定义的数据,只能用在父组件的模板。如果父组件的数据要在子组件中使用,则需要子组件定义props

在定义modal-dialog组件的template时,我们使用了3个slot,它们的name特性分别是header、body和footer。

<modal-dialog>标签下,分别为三个元素指定slot特性:

 

如果需要定制对话框的样式,我们只需要在<modal-dialog>上追加一v-bind指令,让它绑定一个class。

<modal-dialog v-bind:show.sync="show" v-bind:class="dialogClass">

2.父子组件之间的访问

有时候我们需要父组件访问子组件,子组件访问父组件,或者是子组件访问根组件。
针对这几种情况,Vue.js都提供了相应的API:

  • 父组件访问子组件:使用$children或$refs
  • 子组件访问父组件:使用$parent
  • 子组件访问根组件:使用$root

$refs示例

组件个数较多时,我们难以记住各个组件的顺序和位置,通过序号访问子组件不是很方便。
在子组件上使用v-ref指令,可以给子组件指定一个索引ID

 

$parent示例

下面这段代码定义了两个组件:child-component和它的父组件parent-component。
在子组件中,通过this.$parent可以访问到父组件的实例。

3.自定义事件

有时候我们希望触发父组件的某个事件时,可以通知到子组件;触发子组件的某个事件时,可以通知到父组件。
Vue 实例实现了一个自定义事件接口,用于在组件树中通信。这个事件系统独立于原生 DOM 事件,用法也不同。

每个 Vue 实例都是一个事件触发器:

使用 $on() 监听事件;

使用 $emit() 在它上面触发事件;

使用 $dispatch() 派发事件,事件沿着父链冒泡;

使用 $broadcast() 广播事件,事件向下传导给所有的后代

派发事件

 

广播事件

 

 

 

 

原文地址:https://www.cnblogs.com/benbenjia/p/12055289.html