工作总结13:vue官网封装组件

事件名

不同于组件和 prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称。举个例子,如果触发一个 camelCase 名字的事件:

this.$emit('myEvent')

则监听这个名字的 kebab-case 版本是不会有任何效果的:

<!-- 没有效果 -->
<my-component v-on:my-event="doSomething"></my-component>

不同于组件和 prop,事件名不会被用作一个 JavaScript 变量名或 property 名,所以就没有理由使用 camelCase 或 PascalCase 了。并且 v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的),所以 v-on:myEvent 将会变成 v-on:myevent——导致 myEvent 不可能被监听到。

因此,我们推荐你始终使用 kebab-case 的事件名

自定义组件的 v-model

2.2.0+ 新增

一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value attribute 用于不同的目的。model 选项可以用来避免这样的冲突:

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

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

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

这里的 lovingVue 的值将会传入这个名为 checked 的 prop。同时当 <base-checkbox> 触发一个 change 事件并附带一个新的值的时候,这个 lovingVue 的 property 将会被更新。

注意你仍然需要在组件的 props 选项里声明 checked 这个 prop。

将原生事件绑定到组件

你可能有很多次想要在一个组件的根元素上直接监听一个原生事件。这时,你可以使用 v-on 的.native 修饰符:

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

在有的时候这是很有用的,不过在你尝试监听一个类似 <input> 的非常特定的元素时,这并不是个好主意。比如上述 <base-input> 组件可能做了如下重构,所以根元素实际上是一个 <label>元素:

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

这时,父级的 .native 监听器将静默失败。它不会产生任何报错,但是 onFocus 处理函数不会如你预期地被调用。

为了解决这个问题,Vue 提供了一个 $listeners property,它是一个对象,里面包含了作用在这个组件上的所有监听器。例如:

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

有了这个 $listeners property,你就可以配合 v-on="$listeners" 将所有的事件监听器指向这个组件的某个特定的子元素。对于类似 <input> 的你希望它也可以配合 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` 的工作input: function (event) {vm.$emit('input', event.target.value)}})}},template: `<label>{{ label }}<inputv-bind="$attrs"v-bind:value="value"v-on="inputListeners"></label>`
})

现在 <base-input> 组件是一个完全透明的包裹器了,也就是说它可以完全像一个普通的<input> 元素一样使用了:所有跟它相同的 attribute 和监听器都可以工作,不必再使用 .native监听器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从底层重学 Java 之 Stream 初探 Gitchat连接

Gitchat连接 https://gitbook.cn/gitchat/activity/5f85696aad812d16b498848c 简介 从底层&#xff0c;从原理&#xff0c;我们来重学一次 Java。Stream 是JDK8中新引入的&#xff0c;方便了数据列表的过滤、投影、遍历等各种处理&#xff0c;他的源码及实现是怎样的呢&…

签到题

直接查看源代码 nctf{flag_admiaanaaaaaaaaaaa}转载于:https://www.cnblogs.com/maodun/p/6912628.html

从底层重学 Java 之 Stream 并行及标志 GitChat连接

GitChat连接 https://gitbook.cn/gitchat/activity/5f8fc6cd1f577d4d9f428562 简介 从底层&#xff0c;从原理&#xff0c;我们来重学一次 Java。Stream 是JDK8中新引入的&#xff0c;方便了数据列表的过滤、投影、遍历等各种处理&#xff0c;他的源码及实现是怎样的呢&…

工作总结16:多看官网

多看官网 https://cn.vuejs.org/v2/guide/components.html

201521123121 《Java程序设计》第14周学习总结

1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结多数据库相关内容。 数据库的基本特点 1、实现数据共享 数据共享包含所有用户可同时存取数据库中的数据&#xff0c;也包括用户可以用各种方式通过接口使用数据库&#xff0c;并提供数据共享…

Java操作Mongo bulkWrite批量入库

Mongo bulkWrite示例 public boolean insertBulk(String collectionName, JSONArray array) {MongoCollection<Document> collection db.getCollection(collectionName);List<InsertOneModel<Document>> documentList array.stream().map(item -> {Doc…

工作总结17:组件封装思想

就是把部门下拉框选择这部分变成一个组件&#xff0c;在用户创建的时候引入这样就可以把功能不相关代码模块化&#xff0c;以后也便于管理如果别的地方也要用到部门选择&#xff0c;可以直接再次引入&#xff0c;就不用重复写代码了

c#程序中使用quot;like“查询access数据库查询为空的问题

今天&#xff0c;在开发的过程中发现了一个特别奇怪的问题&#xff1a;access中like查询时候。在Access数据库中运行&#xff0c;发现能够查询出结果。这是在数据库上运行。select * from KPProj where KpName like *測试*&#xff0c;可是相同的语句在c#程序中却查询为空。这是…

SpringBoot启动yaml报错

报错找不到org.yaml里的一个方法 10:45:54.742 [main] ERROR org.springframework.boot.SpringApplication - Application run failed java.lang.NoSuchMethodError: org.yaml.snakeyaml.nodes.ScalarNode.getScalarStyle()Lorg/yaml/snakeyaml/DumperOptions$ScalarStyle;at …

JS中的预编译(词法分析)阶段和执行阶段

javascript相对于其它语言来说是一种弱类型的语言&#xff0c;在其它如java语言中&#xff0c;程序的执行需要有编译的阶段&#xff0c;而在javascript中也有类似的“预编译阶段”&#xff08;javascript的预编译是以代码块为范围<script></script>&#xff0c;即每…

Excel分组最大级别为8(outlineLevel最大为7)

excel分组最大级别为8&#xff0c;超过则会删除。 事故现场 Java操作POI分组超过7级&#xff08;算上末级节点&#xff0c;一共8级&#xff09;&#xff0c; 分组作用在sheetData节点下row节点的outlineLevel上&#xff0c;一级分组没有该属性&#xff0c;2-8级分组该值对应为…

Java 的Tuple(类似.net等的元组)

commons-lang3包 两个参数&#xff1a;MutablePair&#xff08;可修改&#xff09;、ImmutablePair&#xff0c;三个参数&#xff1a;MutableTriple&#xff08;可修改&#xff09;、ImmutableTriple&#xff08;不可修改&#xff09; 包commons-lang3 3.8.1里就有 org/apach…

day02-java关键字

转载于:https://www.cnblogs.com/tantanba/p/6917959.html

JacksonUtils Jackson的JSON序列化反序列化

pom.xml添加依赖 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.3</version> </dependency>公共方法 import com.fasterxml.jackson.core.JsonProces…

工作总结8:关于Vue中的slot-scope=“scope“

<template><el-table :data"tableData" style"width: 100%">//---:data"用于存放请求数据回来的数组"<el-table-column label"索引值" width"400"><template slot-scope"scope">//--- 这…

文本

文本样式&#xff1a; color       设置字体颜色 text-align    元素水平对齐方式 text-indent   首行文本的缩进 "em"或"px" line-height    文本的行高 text-decoration 文本的装饰  对齐方式&#xff1a; 水平对齐方式&#xff1a; t…

maven打包报错You have to use a classifier to attach supplemental artifacts to the project instead of rep

maven打包报错You have to use a classifier to attach supplemental artifacts to the project instead of replacing them. [WARNING]JAR will be empty - no content was marked for inclusion!15:51:40 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-ja…