详解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 相关文章推荐
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
vue3中的组件间通信
Mar 31 Vue.js
如何理解Vue简单状态管理之store模式
May 15 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
vue elementUI表格控制对应列
Apr 13 Vue.js
vue3 自定义图片放大器效果的示例代码
Jul 23 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
php采用ajax数据提交post与post常见方法总结
2014/11/10 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
laravel 验证错误信息到 blade模板的方法
2019/09/29 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
python 实现客户端与服务端的通信
2020/12/23 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
Java文件和目录(IO)操作
2014/08/26 面试题
普罗米修斯教学反思
2014/02/06 职场文书
人事专员岗位说明书
2014/07/29 职场文书
科技工作者先进事迹
2014/08/16 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
护理专业自荐信范文
2015/03/06 职场文书
老员工辞职信范文
2015/05/12 职场文书
结婚司仪主持词
2015/06/29 职场文书
Python加密与解密模块hashlib与hmac
2022/06/05 Python
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis