详解vue3中组件的非兼容变更


Posted in Vue.js onMarch 03, 2021

函数式组件

functional attribute 在单文件组件 (SFC) <template> 已被移除
{ functional: true } 选项在通过函数创建组件已被移除

// 使用 <dynamic-heading> 组件,负责提供适当的标题 (即:h1,h2,h3,等等),在 2.x 中,这可能是作为单个文件组件编写的:
// Vue 2 函数式组件示例
export default {
 functional: true,
 props: ['level'],
 render(h, { props, data, children }) {
 return h(`h${props.level}`, data, children)
 }
}

// Vue 2 函数式组件示例使用 <template>
<template functional>
 <component
 :is="`h${props.level}`"
 v-bind="attrs"
 v-on="listeners"
 />
</template>

<script>
export default {
 props: ['level']
}
</script>

现在在 Vue 3 中,所有的函数式组件都是用普通函数创建的,换句话说,不需要定义 { functional: true } 组件选项。
他们将接收两个参数:props 和 context。context 参数是一个对象,包含组件的 attrs,slots,和 emit property。
此外,现在不是在 render 函数中隐式提供 h,而是全局导入 h。
使用前面提到的 <dynamic-heading> 组件的示例,下面是它现在的样子。

// vue3.0
import { h } from 'vue'
const DynamicHeading = (props, context) => {
 return h(`h${props.level}`, context.attrs, context.slots)
}
DynamicHeading.props = ['level']
export default DynamicHeading
// vue3.0单文件写法
<template>
 <component
 v-bind:is="`h${$props.level}`"
 v-bind="$attrs"
 />
</template>

<script>
export default {
 props: ['level']
}
</script>

主要区别在于

functional attribute 在 <template> 中移除
listeners 现在作为 $attrs 的一部分传递,可以将其删除

异步组件的写法与defineAsyncComponent方法

现在使用defineAsyncComponent助手方法,用于显示的定义异步组件
component选项重命名为loader
Loader函数本身不再接受resolve和rejuct参数,必须返回一个Promise

// vue2.x
// 以前异步组件是通过将组件定义为返回Promise的函数来创建
const asyncPage = () => import('./NextPage.vue')
// 或者以选项方式创建
const asyncPage = {
 component: () => import('./NextPage.vue'),
 delay: 200,
 timeout: 3000,
 error: ErrorComponent,
 loading: LoadingComponent
}

// vue3.x
在vue3.x中,需要使用defineAsyncComponent来定义
import{ defineAsyncComponent } from 'vue'
import ErrorComponent from './components/ErrorComponent.vue'
import LoadingComponent from './components/LoadingComponent.vue'

// 不带选项的定义方法
const asyncPage = defineAsyncComponent(() => import('./NextPage.vue'))

// 带选项的异步组件
constasyncPageWithOptions = defineAsyncCopmonent({
 loader: () => import('./NextPage.vue'),
 delay: 200,
 timeout: 3000,
 errorComponent: ErrorComponent,
 LoadingComponent: LoadingComponent
})

loader函数不再接收resolve和reject参数,且必须始终返回Promise

// vue2.x
const oldAsyncComponent = (resolve, reject) => {}
// vue3.x
const asyncComponent = defineAsyncComponent(() => new Promise((resolve, reject) => {}))

组件事件需要在emits选项中声明

vue3中现在提供了一个emits选项,类似props选项
此选项可以用于定义组件向其父对象发出的事件

<!-- vue2.x -->
<template>
 <div>
 <p>{{ text }}</p>
 <button v-on:click="$emit('accepted')">OK</button>
 </div>
</template>
<script>
 export default {
 props: ['text']
 }
</script>

<!-- vue3.x -->
<!-- 现在和prop类似,可以用emits来定义组件发出的事件 -->
<!-- 这个选项还接收已给对象,用来向props一样对传递的参数进行验证 -->
<!-- 强烈建议记录下每个组件发出的所有emits,因为去掉了.native修饰符,未使用声明的事件的所有监听器都将包含在组建的$attr中,默认情况下,该监听器将绑定到组件的根节点 -->
<template>
 <div>
 <p>{{ text }}</p>
 <button v-on:click="$emit('accepted')">OK</button>
 </div>
</template>
<script>
 export default {
 props: ['text'],
 emits: ['accepted']
 }
</script>

以上就是详解vue3中组件的非兼容变更的详细内容,更多关于vue3中组件的非兼容变更的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
Vue实现省市区三级联动
Dec 27 Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 Vue.js
详解vite+ts快速搭建vue3项目以及介绍相关特性
Feb 25 Vue.js
Vue SPA 首屏优化方案
Feb 26 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
vue-cli4.5.x快速搭建项目
May 30 Vue.js
SSM VUE Axios详解
Oct 05 Vue.js
如何优化vue打包文件过大
Apr 13 Vue.js
vite2.0+vue3移动端项目实战详解
Mar 03 #Vue.js
Vue多选列表组件深入详解
Mar 02 #Vue.js
Vue2.x-使用防抖以及节流的示例
Mar 02 #Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 #Vue.js
vue脚手架项目创建步骤详解
Mar 02 #Vue.js
vue-cli中实现响应式布局的方法
Mar 02 #Vue.js
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
Mar 01 #Vue.js
You might like
Windows下的PHP5.0详解
2006/11/18 PHP
PHP 5.3新特性命名空间规则解析及高级功能
2010/03/11 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
Python实现设置windows桌面壁纸代码分享
2015/03/28 Python
详解在Python和IPython中使用Docker
2015/04/28 Python
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
基于Python绘制个人足迹地图
2020/06/01 Python
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
教师岗位聘任书范文
2014/03/29 职场文书
2014年护士长工作总结
2014/11/11 职场文书
课堂打架检讨书200字
2014/11/21 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
秋菊打官司观后感
2015/06/03 职场文书
中学语文教学反思
2016/02/16 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书