Vue | 14 组件深入-自定义事件

news/2024/7/9 23:37:52 标签: vue, frontend technology, framework

内容提要:

  1. 事件名称命名注意事项
  2. 自定义组件v-model的不同用法
  3. 为组件绑定本地事件
  4. .sync修饰符的用法

这页假定你已经阅读了组件基础Components Basics,如果你是组件新手请先阅读它。

事件名称

不像组件和props,事件名称不存在自动大小写转换。相反,事件被发出的名字必须与被监听的名字完全一致,例如,如果发送了一个 cameCased的事件名称:

this.$emit('myEvent')

若监听kebab-cased版本的则没有效果:

<my-component v-on:my-event="doSomething"></my-component>

不像组件和props,在JavaScript中,事件名称将绝对不会被用于事件名或属性名,所以没有理由去使用camelCase 或 PascalCase的书写格式。另外,v-on事件监听在DOM模板内部将自动被转化为小写(由于HTML是大小写不敏感的),所以 v-on:myEvent将变成myEvent-使事件无法被监听。

由于这些理由,我们建议你总是用kebab-case(横线分隔)书写格式的事件名。

自定义组件的v-model

2.2.0 + 新增

默认的,在组件中的v-model使用value作为prop,使用input作为事件。但是一些输入类型像是选择框和单选按钮可能使用属性的value用于不同的目的different purpose。使用model能避免这个例子里的冲突:

Vue.component('base-checkbox',{
    model:{
        prop: 'checked',
        event: 'change'
    },
    props: {
        checked: Boolean
    },
    template: `
    <input
      type="checkbox"
	  v-bind:checked="checked"
      v-on:change="$emit('change', $event.target.checked)">
    `
})

现在当在这个组件上使用v-model的时候:

<base-checkbox v-model="lovingVue"></base-checkbox>

loveVue的值将被传递给checked prop。当base-checkbox标签使用一个新值发出一个change事件的时候,The loveingVue属性将被更新。

注意:你必须声明checked prop在组件的用props操作符。

为组件绑定原生事件

有时候你可能想要在组件的根元素直接监听原生事件。在这些例子中,你能够使用在v-on.native修饰符:

<base-input v-on:focus.native="onFocus"></base-input>

这有时是有用的,但当你试着监听一个特定的元素的时候可能并不是一个好主意。像一个input标签。例如,base-input标签组件之上可能被重构,使其根元素实际上是一个

<label>
    {{ label }}
    <input
       v-bind:="$attrs"
       v-bind:value="value"
       v-on:input="$emit('input', $event.target.value)">
</label>

在那种情况下,.native 在父视图的监听器将会默默的断开。不会有错误,但是onFocus管理者不会在我们希望的时候被调用。

为了解决这个问题,Vue提供了一个$listeners属性,该属性包含在组件上使用的一个监听器对象。例如:

{
    focus:function (event) { /* ... */ }
    input: function (value) { /* ... */ }
}

使用$listeners 属性,你可以使用v-on="$listeners"将组件上所有的事件监听者给到指定的子元素。对于元素像,你也想和v-model一起工作,为监听器创建一个新的计算属性通常很有用,像如下inputListeners

Vue.component('base-input',{
    inheritAttrs:false,
    props: ['label', 'value'],
    computed: {
        inputListeners: function () {
            var vm = this
            // 'Object.assign'将对象合并到一起形成一个新对象
            return Object.assign({},
                                // 我们从父节点添加所有的监听器
                                 this.listeners,
                                 // 然后我们增加自定义的监听器或腹泻一些监听器的行为
                                 {
                // 这会保证v-model和model一起工作
                input: function (event) {
                vm.$emit('input', event.target.value)
            } 
            }
           )
        }
    },
    template:`
    <label>
		{{ label }}
		<input
			v-bind="$attrs"
			v-bind:value="value"
            v-on:"inputListeners">
    </label>
    `
})

.sync 修饰符

2.3.0+ 新增

在一些情况下,我们需要为prop做双向绑定。不巧的是,真正的双向绑定会产生维护问题,因为子组件能够改变父组件,且子组件和父组件都没有明显的改变来源。

这就是为什么,我们建议使用update:myPropeName模式触发事件代替。例如,假设组件有一个title prop,我们可以用以下方法表达分配一个新值的意图:

this.$emit('update:title', newTitle)

然后父组件能够监听到事件,而后可以根据需要更新本地的属性数据,例如:

<text-document
               v-bind:title="doc.title"
               v-on:update:title="doc.title = $event"></text-document>

为了方便,我们使用.sync修饰符提供了这个模式的一个快捷方式:

<text-document v-bind:title.sync="doc.title"></text-document>

注意:使用.sync修饰符的v-bind不能和表达式一起工作(eg:v-bind:title.sync="doc.title + '!'" 是无效的)。相反,你必须提供一个你想要去绑定的属性名,类似v-model

当使用一个对象一次去设置多个props,也可以用.sync修饰符:

<text-document v-bind.sync="doc"></text-document>

这会传递给每一个在doc对象中的属性(例如:title)作为一个单独的prop,而后提交v-on为每一个prop更新监听器。

在一个字面值对象使用v-bind.sync例如在v-bind.sync="{ title: doc.title }",将不能工作,因为在解析这个复杂表达式的时候有很多边缘情况要考虑。


http://www.niftyadmin.cn/n/1035772.html

相关文章

android studio ndk环境搭建(Android.mk方式)

知识点整理1.安装ndk2.android stuido ndk 配置3.编写代码NDK常用编译参数4.运行开发环境&#xff1a;windows10 ,android studio 3.5.2 ,Android.mk方式 1.安装ndk 方式1&#xff1a; https://developer.android.google.cn/ndk/downloads/ 下载下来&#xff0c;解压后&#…

Vue | 15 组件深入-插槽

内容提要&#xff1a; 插槽的内容命名的插槽默认插槽内容插槽的编译范围作用域插槽解构slot-scope 这页假定你已经阅读组件基础&#xff08; Components Basics&#xff09;&#xff0c;如果你不了解组件&#xff0c;请先阅读它。 插槽内容 Vue实现了一套内容分发的API。该API…

Vue | 16 组件深入-动态的异步的组件

内容提要&#xff1a; 避免内容更新—keep-alive与动态组件异步加载组件的处理方式 这页假定你已经了解组件基础 Components Basics&#xff0c;如果你不了解组件请先读它。 keep-alive与动态组件 之前&#xff0c;我们使用is属性去切换组件在标签栏界面&#xff1a; <com…

SAP 物料 移动类型

SAP 物料 移动类型 MvT 移动类型文本 含义 一般用途 T-code 101 GR 收货 直接收货 工单入库&#xff0c;购买成品入库 MIGO/CO11N 102 用于PO冲销的收货 冲销直接收货 冲销工单入库 MIGO/CO11N 103 进入冻结库存的收货 收入质检仓 送检单 MIGO 104 到冻结冲销的收货 冲销收…

Vue | 17 组件深入-处理边界情况

内容提要&#xff1a; 元素和组件的访问&#xff1a;根实例、父组件实例、子组件实例和子元素的访问方式以及依赖注入程式化事件监听器循环应用的产出原因及解决方式使用inline Templates、X-Templates替代模板定义数据更新的控制&#xff1a;强制更新和加载静态内容的方式 这页…

Vue | 18 过渡动画-进入/离开列表过渡

内容提要&#xff1a; 单个元素或组件的过渡: 过渡类、CSS过渡、CSS动画、自定义过渡类、动画和过渡在一起使用、声明过渡持续时间、JavaScript钩子初始渲染的过渡元素间的过渡组件间的过渡列表的过渡&#xff1a;列表进入/离开过渡&#xff0c;列表项移动过渡&#xff0c;交错…

android studio ndk编译的两种方式(ndk-build和cmake)配置

知识点整理1.ndk-build2.Cmake方式&#xff08;常用&#xff09;(1)build.gradle(2) 跟build同级目录创建CMakeLists.txt(3)在src/main jni 里面创建CMakeLists.txt生成so库安卓默认用armeabi-v7a 1.ndk-build 动态加载JNI 1.java 层代码&#xff1a; static {System.loadLib…

Vue | 19 过渡动画-状态过渡

内容提要&#xff1a; 动画的状态与监听器动态状态过渡在组件内组织过渡为设计赋予生命 Vue的过渡系统提供了许多简单的方式去实现动画的进入、离开和列表的动效。但是怎么样对你的数据本身进行动画处理呢&#xff1f;例如&#xff1a; 数字和计算颜色显示可缩放的矢量图形节点…