详解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页面刷新,数据丢失的问题
Nov 24 Vue.js
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
Feb 11 Vue.js
Vue3.0 手写放大镜效果
Jul 25 Vue.js
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
Vue3中toRef与toRefs的区别
Mar 24 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数据流应用的简单例子
2012/06/01 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
详解python如何引用包package
2020/06/07 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
美国电视购物:QVC
2017/02/06 全球购物
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
行政助理岗位职责
2013/11/10 职场文书
自荐书模板
2013/12/15 职场文书
实习心得体会
2014/01/02 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
预备党员群众意见
2015/06/01 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android