监听数组 — 非兼容
最后更新于:2022-04-02 08:14:44
>[success] # 监听数组
~~~
1.非兼容: 当侦听一个数组时,只有当数组被替换时才会触发回调。如果你需要在数组改变时触发
回调,必须指定 deep 选项。
~~~
>[danger] ##### vue3.0
~~~
1.在 Vue 3.x 当我们监听一个数组时,只有在数组被整体替换时才会触发回调。也就是说,如果我们只对数
组进行增删改查操作时,是不会被 Vue 捕捉到的。如果想要在数组在发生改变时被 Vue 识别到,我们必须
手动添加 deep 选项。如下
~~~
~~~
watch: {
bookList: {
handler(val, oldVal) {
console.log('book list changed')
},
deep: true
},
}
~~~
';
v-bind 合并行为 非兼容
最后更新于:2022-04-02 08:14:42
[v-bind 合并行为非兼容](https://v3.cn.vuejs.org/guide/migration/v-bind.html#%E6%A6%82%E8%A7%88)
';
v-if 与 v-for 的优先级对比 — 非兼容
最后更新于:2022-04-02 08:14:39
>[success] # v-if 和v-for
~~~
1.v-if 的优先级比 v-for 更高,这意味着 v-if 将没有权限访问 v-for 里的变量:
~~~
~~~html
{{ todo }}
~~~
* 可以这么修改
~~~html
{{ todo }}
~~~
~~~
1.上面的写法依旧不是一个很好的做法,建议在使用计算属性,在计算属性中将需要的值进行过滤掉
~~~
[v-if 与 v-for 的优先级对比非兼容](https://v3.cn.vuejs.org/guide/migration/v-if-v-for.html#%E6%A6%82%E8%A7%88)
';
Transition Group 根元素 — ??
最后更新于:2022-04-02 08:14:37
过渡的 class 名更改 ???
最后更新于:2022-04-02 08:14:35
Slot 统一 ??
最后更新于:2022-04-02 08:14:32
渲染函数 API — ??
最后更新于:2022-04-02 08:14:30
组件使用 v-model — 非兼容
最后更新于:2022-04-02 08:14:28
>[success] # v-model
~~~
1.'非兼容':用于自定义组件时,v-model prop 和事件默认名称已更改:
1.1.'prop':value -> modelValue;
1.2.'event':input -> update:modelValue;
2.'非兼容':v-bind 的 .sync 修饰符和组件的 model 选项已移除,可用 v-model 作为代替;
3.'新增':现在可以在同一个组件上使用多个 v-model 进行双向绑定;
4.'新增':现在可以自定义 v-model 修饰符。
~~~
>[info] ## v-model 非组件基础使用
~~~
1.'v-model' 指令在表单 '、
';
在 prop 的默认函数中访问 this — ??
最后更新于:2022-04-02 08:14:25
移除 $listeners 和 v-on.native — 非兼容
最后更新于:2022-04-02 08:14:23
>[success] # 移除$listeners -- 非兼容
~~~
1.$listeners 对象在 Vue 3 中已被移除。现在事件监听器是 $attrs 的一部分
~~~
>[info] ## vue2.x 使用
~~~
1.'$listeners' 和'$attrs' 出发点的解决思路是一样的,前者是针对事件,后者是针对属性
~~~
>[danger] ##### 案例说明
~~~
1.如果在父组件调用子组件的过程中事件配合'.native' 修饰符相当于给子组件加了一个事件,这样的好处
如果子组件内没有事件暴露出,但我们仅仅只是想通过操作子组件触发父组件的一些事,在通俗的理解
将子组件看做了一个普通dom 并且绑定了一个事件
2.先了解'v-on' 他是支持' v-on="{ mouseover: doTish, mouseout: doThat }"' 这种对象形式的使用
~~~
>[danger] ##### 上面第一条的案例解释
~~~
1.下面案例如果事件没有使用'native'修饰符点击事件是不生效的,可以这么理解没有加是认为你在子组件
通过'$emit'将子组click事件暴露出来,加了理解成整体认为是一个dom元素仅仅是一个元素的click事件
2.子组件是由 'div' 嵌套 'button' 那通过'native'修饰的子组件被处罚事件属于div 还是属于button,这取决于
用户点击的位置,如果用户点击的位置是div 那么就是div触发的click事件 相反就是button触发
~~~
* 父组件
~~~
~~~
* 子组件
~~~
~~~
>[danger] ##### $listeners 使用
~~~
1.下面课看出通过$listeners 在子组件在进行简写
~~~
~~~
~~~
* 没有使用
~~~
~~~
* 使用
~~~
~~~
>[danger] ##### 更多具体的参考这个
[跨层级](https://www.cnblogs.com/badaozongcai/articles/12791262.html)
[利用计算属性合并](https://www.jumtu.com/article/116843.html)
>[info] ## vue3.0 ?? 有点蒙蔽后续看
~~~
1.在 Vue 3 的虚拟 DOM 中,事件监听器现在只是以 on 为前缀的 attribute,这样就成了 $attrs 对象的一部分,
因此 $listeners 被移除了。
~~~
>[danger] ##### 案例
~~~
1.如果是事件,在'$attrs' 对应的key 要加on 例如下面案例在'$attrs' 为
{
onMouseover:fn...,
onClick:fn...,
}
~~~
~~~
~~~
~~~
~~~
>[danger] ##### vue3.x 移除.native
~~~
1.移除后在以前使用.native 去掉即可 逻辑思维整体还是一样的
~~~
';
按键修饰符 — 非兼容
最后更新于:2022-04-02 08:14:21
[按键修饰符 -- 非兼容](https://v3.cn.vuejs.org/guide/migration/keycode-modifiers.html)
';
key attribute — 非兼容
最后更新于:2022-04-02 08:14:19
[官方解释清楚系列](https://v3.cn.vuejs.org/guide/migration/key-attribute.html#%E6%A6%82%E8%A7%88)
';
内联模板 Attribute — 非兼容
最后更新于:2022-04-02 08:14:16
>[success] # 内联模板 Attribute -- 非兼容
~~~
1.这个我没用过,在vue3.x 被移除了
~~~
>[danger] ##### 参看官方解释
[链接](https://v3.cn.vuejs.org/guide/migration/inline-template-attribute.html#%E6%A6%82%E8%A7%88)
';
全局 API Treeshaking — 非兼容
最后更新于:2022-04-02 08:14:14
[参看官网的就可以](https://v3.cn.vuejs.org/guide/migration/global-api-treeshaking.html#_2-x-%E8%AF%AD%E6%B3%95)
>[success] # 简单解释
~~~
1.在 Vue 3 中,Vue 团队考虑了 Tree Shaking 兼容,进行了重构,全局 API 需要通过原生 ES Module 的
引用方式进行具名引用
~~~
';
全局 API — 非兼容
最后更新于:2022-04-02 08:14:12
[官网写的很好了](https://v3.cn.vuejs.org/guide/migration/global-api.html#%E5%9C%A8%E5%BA%94%E7%94%A8%E4%B9%8B%E9%97%B4%E5%85%B1%E4%BA%AB%E9%85%8D%E7%BD%AE)
';
函数式组件 — 非兼容
最后更新于:2022-04-02 08:14:09
片段 — 新增
最后更新于:2022-04-02 08:14:07
>[success] # 片段
~~~
1.Vue 3 现在正式支持了多根节点的组件,也就是片段!
~~~
>[info] ## vue2.x
~~~
1.在 2.x 中,由于支持多根节点组件
~~~
~~~html
...
...
~~~
>[info] ## vue3.x
~~~
1.vue3.x 支持多节点
~~~
~~~html
...
...
~~~
>[danger] ##### 产生的相应问题
~~~
1.之前分析过vue 组件可以如果没有通过prop定义的属性,父组件传入将会作用在子组件的根节点上,
现在多节点导致没有最外层的根节点此时需要指定好这类没有定义的属性要作用在那个dom节点上
~~~
~~~html
...
...
~~~
* 你也可以这么做
~~~html
~~~
~~~
const app = Vue.createApp({})
app.component('my-component', {
template: `
';
Hi!
This is a child component ` }) ~~~过滤器 — 移除
最后更新于:2022-04-02 08:14:05
>[success] # 过滤器
~~~
1.从 Vue 3.0 开始,过滤器已删除,不再支持。
~~~
>[info] ## 官方给的建议
~~~
1.建议用计算属性或方法代替过滤器,而不是使用过滤器。
~~~
>[info] ## vue2.x =》 vue3.x 全局过滤属性官方也给了对应建议
~~~
1.如果在应用中全局注册了过滤器(vue2.x 项目想到3.x),那么在每个组件中用计算属性或方法调用来替
换它可能就没那么方便了。你可以通过全局属性在所有组件中使用
~~~
>[danger] ##### 案例
* 定义一个全局的'$filters' 对象
~~~
// main.js
const app = createApp(App)
app.config.globalProperties.$filters = {
currencyUSD(value) {
return '$' + value
}
}
~~~
* 通过 $filters 对象修改所有的模板
~~~
';
Bank Account Balance
{{ $filters.currencyUSD(accountBalance) }}
~~~事件 API — 非兼容
最后更新于:2022-04-02 08:14:02
>[success] # 事件api
~~~
1.$on,$off 和 $once 实例方法已被移除,应用实例不再实现事件触发接口。
~~~
>[info] ## 官方给出的相应替代方案
可以使用实现了事件触发接口的外部库来替换现有的 event hub,例如[mitt](https://github.com/developit/mitt)或[tiny-emitter](https://github.com/scottcorgan/tiny-emitter)。兼容性构建中也支持这些方法。
';
emits Option — 新增
最后更新于:2022-04-02 08:14:00
>[success] # emits Option
~~~
1.emits 触发当前实例上的事件。附加参数都会传给监听器回调,最常见的用处子传父
2.'Vue 3'现在提供了一个emits选项,类似于现有props选项。此选项可用于定义组件可以向其父对象发出的事件,
这种使用是新增方法,之前的写法依然可以在vue3.x中使用
~~~
>[info] ## vue2.x 和 3.x 都通用的写法
* 子组件
~~~
~~~
* 父组件
~~~
~~~
>[info] ## vue3.x 新增写法
~~~
1.父组件调用触发的地方用法没变,新增的用法是在子组件多了一'emits'属性
~~~
>[danger] ##### 3.0写法
~~~
1.和prop写法类型,都支持定义(数组的形式)和验证(对象的形式)两种,如果你是用的是对象验证
的形式方法返回必须要有boolean 返回值,参数是你传入的值,下面案例为例说明 参数test打印的参数
' {email: "foo@bar.com", password: 123}'
2.如果你没参数验证可以将value 定义为null 举个例子 $emit('accepted') 没有传出参数,那么在emits
中定义为emits:{accepted:null}
~~~
~~~
~~~
>[info] ## 我应该按照新的写法还是以前
~~~
1.官网给的建议强烈建议您使用记录每个组件发出的所有事件'emits'。这一点特别重要,因为去除了'.native'修饰剂。
'emits'现在,未使用声明的事件的所有侦听器都将包含在组件的中'$attrs',默认情况下,该侦听器将绑
定到组件的根节点
2.下面案例如果emit的是原生的事件(如,click),就会存在两次触发。一次来自于$emit的触发;
一次来自于根元素原生事件监听器的触发,解决方使用3.x新增的声明emits 方式,注意下面的案例是注释掉的
如果不想被触发两次需要配置'emits',注意这里指的是原生事件
3.如果父组件哪里不是原生事件不加' emits: ['click']' 只会触发一次
~~~
* 子组件
~~~
~~~
* 父组件
~~~
~~~
';