22.VUE之组件(组件细节、模块系统、v-model语法糖)

目录

(1)H5编码规范与template模板的3种写法
(2)组件data
(3)组件名
(4)组件注册
(5)模块系统(需结合后续工程化使用,这里简单了解即可)
(6)自定义事件(父子组件通信)
(7).sync修饰符
(8)自定义组件之v-model语法糖

H5编码规范

分析如下代码中的组件解析结果
在这里插入图片描述
H5规范中要求,table里为tbody,tbody里需要放置tr和td,否则会将代码解析到table外。
方案:
这里,tbody中放置的是row,所以会解析到table同级外部,解决方案为is属性。既然tbody里只能放置tr,那么这里便改成tr+is属性
在这里插入图片描述

template组件模板写法

写法一:直接写在选项里的模板
直接在构造器里的template选项后边编写。这种写法比较直观,但是如果模板html代码太多,不建议这么写。

在这里插入图片描述

这里需要注意的是模板的标识不是单引号和双引号,而是,就是Tab上面的键

写法二:写在template标签里的模板
这种写法更像是在写HTML代码,就算不会写Vue的人,也可以制作页面。

在这里插入图片描述
写法三:写在script标签text/x-template里的模板
这种写模板的方法,可以让模板文件从外部引入。

在这里插入图片描述
小结:
写法一:直接写在选项里的模板
写法二:写在template标签里的模板
写法三:写在script标签里的模板

组件data

组件data
在使用 data 和实例稍有区别, 组件的data必须是函数,且必须将数据 return出去。
案例:
在这里插入图片描述

组件名

在注册一个组件的时候,始终需要给它一个名字。比如在全局注册的时候,该组件名就是 Vue.component 的第一个参数
在这里插入图片描述

注意:
(1)命名注意“语义化”:即你给予组件的名字可能依赖于你打算拿它来做什么
(2)定义组件名的方式3种

组件注册

为了能在模板中使用,组件必须先注册以便 Vue 能够识别。Vue有两种组件的注册类型:全局注册和局部注册。

(1)全局注册

在这里插入图片描述

全局注册的组件,在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中。如下所示:
在这里插入图片描述
全局组件“嵌套性”:在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用。

2)局部注册
缘由:全局注册往往是不够理想的,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的JS的无谓的增加。
在这些情况下,你可以通过一个普通的 JS对象来定义组件。
在这里插入图片描述
如上所示使用JS对象定义好组件对象,然后在 components 选项中定义你想要使用的组件

在这里插入图片描述

对于 components 对象中的每个属性来说,其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。

局部组件局限
局部注册的组件在其子组件中不可用。
例如:如果你希望 ComponentA 在 ComponentB 中可用,则需要这样写

在这里插入图片描述

或者如果通过 Babel 和 webpack 使用 ES2015 即ES6 模块,那么代码如下所示:
在这里插入图片描述
在 ES2015+ 中,在对象中放一个类似 ComponentA 的变量名其实是 ComponentA: ComponentA 的缩写,即这个变量名同时是:
①用在模板中的自定义元素的名称
②包含了这个组件选项的变量名

模块系统

(1)在模块系统中局部注册
工程化完毕后,在项目下创建一个 components 组件目录,并将每个组件放置在其各自的文件中。然后需要在局部注册之前导入每个想使用的组件。例如,在一个假设的 ComponentB.js 或 ComponentB.vue 文件中:
在这里插入图片描述
2)基础组件的自动化全局注册
可能你的许多组件只是包裹了一个输入框或按钮之类的元素,是相对通用的。我们会把它们称为基础组件,它们会在各个组件中被频繁的用到。所以会导致很多组件里都会有一个包含基础组件的长列表,如下所示
在这里插入图片描述
如果使用了 webpack (或在内部使用了 webpack 的 Vue Cli 3+),那么就可以使用 require.context 只全局注册这些非常通用的基础组件。
在应用入口文件 (比如 src/main.js) 中全局导入基础组件的示例代码,如下所示:
在这里插入图片描述

自定义事件

正如之前所讲,子组件→父组件
当子组件需要向父组件传递数据时,需要用到自定义事件。
Vue 组件有一套观察者模式,子组件用 e m i t ( ) 来 触 发 事 件 , 父 组 件 用 emit()来触发事件,父组件用 emit()on()来监听子组件的事件

语法结构:
父组件通过v-on:eventName="parentEventName"来设置监听
子组件通过 . e m i t ( ′ e v e n t N a m e ′ ) 来 触 发 事 件 。 自 定 义 事 件 案 例 : ( 1 ) 子 组 件 触 发 事 件 .emit('eventName')来触发事件。 自定义事件案例: (1)子组件触发事件 .emit(eventName)1.emit(‘eventName’,option)

在这里插入图片描述
(2)父组件设置监听v- on:eventName="parentEventName"并接收参数
在这里插入图片描述

自定义事件之事件名:
不同于组件和 prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称。举个例子,如果触发一个 camelCase 名字的事件:
在这里插入图片描述
则监听这个名字的 kebab-case 版本是不会有任何效果的:
在这里插入图片描述

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

推荐:
综上所述,对于自定义事件名,建议始终使用 kebab-case 短横线命名法。

.sync修饰符
前言:
在vue2.4以前,父组件向子组件传值用props;子组件不能直接更改父组件传入的值,需要通过$emit触发自定义事件,通知父组件改变后的值,如此才能实现父子组件的通信。
过程比较繁琐,写法如下:
在这里插入图片描述
vue2.4以后的写法明显舒服许多,上面同样的功能,直接上代码

在这里插入图片描述

写法上简化了一部分,很明显父组件不用再定义方法检测值变化了。其实只是对以前的$emit方式的一种缩写,.sync其实就是在父组件定义了一update:value方法,来监听子组件修改值的事件。

v-model语法糖

首先来回顾下v-model相关知识点。

(1)v-model指令是什么?
vue通过v-model实现双向绑定数据,所以首先我们要明白v-model在这个过程中做了什么。
(2)v-model指令本质?
有vue基础的同学应该知道,v-model本质是一个语法糖。
即v-bind和v-on的结合体。
(3)v-model本质验证
表单元素比如input,v-bind绑定一个值,就把data数据传给了value,同时再通过v-on监听input事件,当表单数据改变的时候,也会把值传给data数据,代码如下
在这里插入图片描述
4)v-model等效写法

综上所述,v-model为v-on和v-bind结合体
在这里插入图片描述

自定义组件之v-model

前言:
在日常开发中,自定义一个支持双向绑定的组件是非常常见的应用场景,而官方文档中对于自定义组件如何实现v-model双向绑定的描述几近于0。那么,怎样实现一个自定义组件v-model,就是本篇将要介绍的内容。

官方文档:
允许一个自定义组件在使用 v-model 时定制 prop 和 event。默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。使用 model 选项可以回避这些情况产生的冲突。

官方文档说明:
上面,这句话比较长,咱们来一步步理解,首先是第一句
------允许一个自定义组件在使用v-model时定制prop和event
一般说来,v-model用在表单元素上进行数据的双向绑定,自定义组件通常通过父子组件传值绑定数据-- – - -默认情况下,一个组件上的v-model会把value用作prop且把input用作event。
前边说了,v-model是v-bind和v-on的语法糖,那么这里v-model就完成两个步骤,接下来举个例子
案例1:组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件
在这里插入图片描述
案例:1:
上述代码中父组件的v-model相当于v-on+v-bind写法结合,如下

在这里插入图片描述
父级方法接收返回值,更新数据
在这里插入图片描述
代码解析:
前面说了,父子组件传值通过prop和$emit

第一步:父组件把num通过prop传给了子组件,但要注意,这里的子组件可以给prop取了一个别名,例如叫做value作为区分,所以子组件的props对象中的键为取的别名value。如果没有设置别名,则直接使用即可
第二步:当子组件input值改变的时候,子组件监听了一个oninput方法,注意这里也给 e m i t 中 的 事 件 取 了 一 个 别 名 , 只 不 过 这 个 别 名 和 原 来 的 名 字 一 样 o n i n p u t , i n p u t 值 改 变 后 , 通 过 emit中的事件取了一个别名,只不过这个别名和原来的名字一样oninput,input值改变后,通过 emitoninputinputemit提交input事件并把新值传给父组件,又要注意->$emit的荷载为字符串

官方解析:
v-model用在自定义组件最大的好处是提高了组件的封装性,父组件不必要另外写一个接受子组件发送给来的$emit方法。

最后是第三句话,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。
—其实这很容易理解,因为value字符串在input中是有意义的,取别名有利于区分…
案例2:对上述案例做下调整,修改事件类型event为blur失焦时触发,代码如下

在这里插入图片描述

此时,不再是实时输入触发数据更新,而是输入框失焦时更新数据。

案例3:
正如官方文档所说:像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的,model 选项可以用来避免这样的冲突。
接下来修改model默认项,如下所示
在这里插入图片描述

总结

1、v-model是v-bind:value和v-on:input的简写
2、H5编码规范中要求,部分标签的嵌套结构必须固定(例如:table里为tbody,tbody里需要放置tr和td,否则会将代码解析到table外)
3、不同于组件和 prop,事件名$emit(事件)不存在任何自动化的大小写转换,必须短横线
4、组件名语义化:命名注意“语义化”,即你给予组件的名字可能依赖于你打算拿它来做什么

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 同步和异步: 同步指的是代码按顺序执行,每一行代码执行完成后才会执行下一行代码。异步指的是代码可以同时执行,不需要等待当前代码执行完成才能执行下一行代码。 2. localStorage、sessionStorage和cookie的区别: localStorage和sessionStorage是HTML5中新增的API,都用于在客户端存储数据。localStorage存储的数据没有过期时间,并且在同一域名下的所有页面都可以共享;sessionStorage存储的数据只在当前会话(窗口)有效,关闭页面或浏览器后会被清除。cookie也可以在客户端存储数据,并且可以设置过期时间,但是每次HTTP请求都会发送cookie,会增加请求的数据量。 3. Vue中key的作用: key主要用于Vue的虚拟DOM算法,Vue通过比较新旧虚拟节点的key值来判断是否需要更新真实DOM。如果没有设置key值,Vue会使用默认的算法来比较节点,这样会影响性能。 4. 支付流程: 支付流程一般包括以下几个步骤:用户下单、选择支付方式、跳转到支付页面、支付成功或失败后返回商户页面。 5. Vuex的模块化: Vuex的模块化可以将store分为多个子模块,每个子模块都有自己的state、mutation、action、getter等,可以简化代码结构,提高代码可维护性。可以通过Vuex.Store的modules选项来定义子模块。 6. Vite和webpack的不同: Vite是一种基于浏览器原生ES模块机制的构建工具,它可以快速启动开发服务器、支持HMR、按需编译等特性,可以大幅提高开发效率。而webpack是一种通用的构建工具,可以支持多种模块化方案、插件、loader等,功能更加强大,但是启动速度和构建速度相对较慢。 7. 事件冒泡和捕获: 事件冒泡指的是事件传递的顺序,从子元素一直传递到父元素,直到文档根节点。事件捕获相反,是从父元素开始,一直传递到子元素。事件处理器可以在事件的冒泡或捕获阶段进行处理。 8. React中的事件合成机制: React使用事件合成机制来处理浏览器原生事件,通过事件池来重复利用事件对象,减少内存开销。事件合成机制还可以处理跨平台兼容性问题,例如在不同浏览器中的事件差异。 9. Map,foreach,for...of区别: Map是ES6中新增的数据结构,用于存储键值对,可以使用for...of循环遍历;forEach是Array原型上的方法,用于遍历数组中的元素,不支持break和continue;for...of是ES6中新增的遍历语法,可以遍历数组、Map、Set等数据结构,支持break和continue。 10. 组件之间如何自定义实现一个v-model: 可以通过props和emit来实现自定义v-model。父组件将value和input事件绑定到子组件的props和emit上,子组件通过props接收value,通过emit触发input事件,并将新值传递给父组件。可以使用v-bind和v-on指令来简化代码。例如: ```vue <template> <custom-input :value="name" @input="handleInput" /> </template> <script> import CustomInput from './CustomInput.vue'; export default { components: { CustomInput, }, data() { return { name: '', }; }, methods: { handleInput(value) { this.name = value; }, }, }; </script> ``` ```vue <template> <input :value="value" @input="handleInput" /> </template> <script> export default { props: { value: { type: String, required: true, }, }, methods: { handleInput(event) { this.$emit('input', event.target.value); }, }, }; </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值