この記事では、vue3.0 の新機能と使用法の概要を紹介します。これには、いくつかの新しい変更点と、使用できなくなった以前の構文が含まれています。皆様のお役に立てれば幸いです。
パフォーマンスの向上 (コストゼロ: vue2 から vue3 に切り替えることで実現できます) )
最初のレンダリングの高速化、差分アルゴリズムの高速化、メモリ使用量の削減、パッケージ サイズの縮小など....
Typescript サポートの向上 (vue では、より便利です)以下に TS を書きます)
コードを記述するための新しい方法を提供します: コンポジション API
vue3.0 は、バージョン 2.0 のほとんどの構文と互換性があります (以前はどのように記述されていたか、現在は通常どおりに記述されています)。ただし、いくつかの破壊的な構文更新もあります。これに特に注意してください:
1. vue インスタンスの $on メソッドを削除しました (eventBusVue.prototype.$eventBus=new Vue(); this.$on('event name' , callback)
既存の実装モードはサポートされなくなったため、サードパーティのプラグインに置き換えることができます。 vue2 でのeventBusの使用法は次のとおりです。
Vue.prototype.$eventBus = new Vue() 组件1 this.$on('事件名', 回调) 组件2 this.$emit('事件名')
2. フィルタ オプションを削除します。 vue2 でのフィルターの使用法は次のとおりです。
<div>{{ msg | format}}</div> 插值表达式里, 不能再使用过滤器filter, 可以使用methods替代 {{format(msg)}}
3. .sync 構文を削除します (.sync 修飾子は v-bind では使用できません。現在、v-model 構文とマージされています)。以下は、vue2
<el-dialog :visibel.sync="showDialog"/>
主に 3 つの場所に依存します:
package.json
main.js
app.vue
まず、依存関係構成項目に表示されている package.json
ファイルを見てみましょう。現在使用しているバージョンは 3
"dependencies": { "core-js": "^3.6.5", "vue": "^3.2.25" // 版本号 }
次に、##main.js エントリ ファイルを開くと、以前の新しいキーワードのインスタンス化から createApp メソッドの呼び出し形式まで、Vue のインスタンス化にいくつかの変更が加えられていることがわかります。
import Vue from 'vue' import App from './App.vue' new Vue({render: h => h(App)}).$mount('#app')
import { createApp } from 'vue' import App from './App.vue' // 根组件 createApp(App).mount('#app')
<template> <img alt="Vue logo" src="./assets/logo.png"> <HelloWorld msg="Welcome to Your Vue.js App"/> </template>
Vue2 オプション API、オプション API (図)、Vue3 結合 API、構成 API (右側の図):
#Vue2 オプション API、オプション API: 利点:
理解しやすく、使いやすい。各オプション(設定項目)は記述位置が決まっているため(例:データオプションにデータを記述する、メソッドに操作方法を記述する等)
デメリット:
アプリケーションが大きい その後、コードを見つけるために行ったり来たり、つまり水平方向にジャンプするというジレンマに誰もが遭遇したことがあると思います。
Vue3 コンポジション API、コンポジション API: 機能:
##概要:
結合 API の起源。 vue3 は新しいコード記述方法を提供するため (古い方法も使用可能)、vue2 と区別するために異なる名前が付けられています。
Vue2 オプション API (option api) 利点: シンプル、各オプション独自の機能を実行する; デメリット: 関数の再利用に不便; 関数コードが分散して保守され、コードがジャンプする Vue3 合成 API (composition api) メリット: 関数コードの組み合わせが保守され、関数の再利用に便利;4. セットアップ セットアップ関数は新しいコンポーネント オプションであり、コンポーネント
セットアップ関数はコンポーネントの初期化時に 1 回だけ実行されます
セットアップ関数は、beforeCreate ライフサイクル フックが実行される前に実行されます。
setup() { console.log('setup....', this) }, beforeCreate() { console.log('beforeCreate') // 它比setup迟 }
setup を使用する場合、2 つのパラメータを受け入れます。 :
props: props は、親コンポーネントによって渡されたすべての prop データを含むオブジェクトです。
context: context对象包含了attrs,slots, emit属性
返回值
这个函数的返回值是一个对象,在模版中需要使用的数据和函数,需要在这个对象中声明(如果在data()中也定义了同名的数据,则以setup()中为准)。
<template> <div class="container"> 姓名:{{name}},月薪:{{salary}} <button @click="say">打个招呼</button> </div> </template> <script> export default { setup () { console.log('setup执行了,这里没有this. this的值是:', this) // 定义数据和函数 const name = '小吴' const salary = 18000 const say = () => { console.log('我是', name) } // 返回对象,给视图使用 return { msg , say} }, beforeCreate() { console.log('beforeCreate执行了, 这里有this,this的值是:', this) } } </script>
setup 中接受的props
是响应式的, 当传入新的 props 时,会及时被更新。由于是响应式的, 所以不可以使用 ES6 解构,解构会消除它的响应式。 错误代码示例, 这段代码会让 props 不再支持响应式:
export default com ({ setup(props, context) { const { uname } = props console.log(uname) }, })
开发中我们想要使用解构,还能保持props
的响应式,有没有办法解决呢?setup接受的第二个参数context,我们前面说了setup中不能访问 Vue2 中最常用的this对象,所以context中就提供了this中最常用的三个属性:attrs、slot 和emit,分别对应 Vue2.x 中的 $attrs属性、slot 插槽 和$emit发射事件。并且这几个属性都是自动同步最新的值,所以我们每次使用拿到的都是最新值。
在 vue2.x 中, 定义数据都是在data中, 但是 Vue3.x 可以使用 reactive 和 ref 来进行数据定义。
如何取舍ref和reactive?
定义响应式数据有两种方式:
ref函数(可以处理简单数据,也可以处理复杂数据),常用于将简单数据类型定义为响应式数据
在代码中修改(或者获取)值时,需要补上.value
在模板中使用时,可以省略.value
reactive函数,常用于将复杂数据类型为响应式数据
推荐用法:
优先使用ref
如果明确知道对象中有什么属性,就使用reactive。例如,表单数据
接下来使用代码展示一下 ref、reactive的使用:
<template> <div class="container"> <p>{{ num }}</p> <p>姓名: {{ user.uname }}</p> <p>年龄: {{ user.age }}</p> </div> </template> <script> import { reactive, ref, toRefs } from "vue"; export default com({ setup() { const num = ref(0); const user = reactive({ uname: "vivian", age: 18}); setInterval(() => { num.value++; user.age++; }, 1000); return { year, user }; }, }); </script>
上面的代码中,我们绑定到页面是通过user.uname,user.age这样写感觉很繁琐,我们能不能直接将user中的属性解构出来使用呢? 答案是不能直接对user进行结构,这样会消除它的响应式,这里就和上面我们说props不能使用 ES6 直接解构就呼应上了。那我们就想使用解构后的数据怎么办,解决办法就是使用toRefs,
定义转换响应式中所有属性为响应式数据,通常用于解构|展开reactive定义对象, 简化我们在模板中的使用。
格式:
// 响应式数据:{ 属性1, 属性2 } let { 属性1, 属性2 } = toRefs(响应式数据)
具体使用方式如下:
<template> <div class="container"> <p>{{ num }}</p> <p>姓名: {{ uname }}</p> <p>年龄: {{ age }}</p> </div> </template> <script> import { defineComponent, reactive, ref, toRefs } from "vue"; export default com({ setup() { const num = ref(0); const user = reactive({ uname: "vivian", age: 18}); setInterval(() => { num.value++; user.age++; }, 1000); return { year, // 使用reRefs ...toRefs(user), }; }, }); </script>
增强版的结构赋值:在解构对象的同时,保留响应式的特点。
setup创建实例前
onBeforeMount挂载DOM前
onMount挂载DOM后
BeforeUpdate 更新组件前
updated 更新组件后
onBeforeUnmount卸载销毁前
onUnmount 卸载销毁后
setup () { onBeforeMount(()=>{ console.log('DOM渲染前',document.querySelector('.container')) }) onMounted(()=>{ console.log('DOM渲染后1',document.querySelector('.container')) }) }
Vue3.x 还新增用于调试的钩子函数onRenderTriggered和onRenderTricked, 另外,Vue3.x 中的钩子是需要从 vue 中导入的:
import { defineComponent, onBeforeMount, onMounted, onBeforeUpdate,onUpdated, onBeforeUnmount, onUnmounted, onErrorCaptured, onRenderTracked,onRenderTriggered } from "vue"; export default defineComponent({ //beforeCreate和created是vue2的 beforeCreate() { console.log("--beforeCreate--") }, created() { console.log("--created--") }, setup() { console.log("--setup--") // vue3.x生命周期写在setup中 onBeforeMount(() => { console.log("--onBeforeMount--") }) onMounted(() => { console.log("--onMounted--"); }) // 调试哪些数据发生了变化 onRenderTriggered((event) =>{ console.log("--onRenderTriggered--",event) }) }, });
格式:
import { computed } from 'vue' const 计算属性名 = computed(() => { return 相关计算结果 })
代码示例:
<template> <p>姓名:{{name}}, 公司:{{company}}, 月薪:{{salary}}, 年薪{{total}}</p> <button @click="double">月薪double</button> </template> <script> import { ref, computed } from 'vue' export default { name: 'App', setup () { // 定义响应式对象 const company = ref('DiDi') const name = ref('小王') const salary = ref(18000) const double = () => { salary.value *= 2 // ref数据要加.value } // 定义计算属性 const total = computed(() => 12 * salary.value) return { name, company, total, salary, double } } } </script>
总结:
vue3中的computed函数与vue2中的computed选项功能类似。
computed的入参是一个函数
作用:根据已有数据,产生新的响应式数据。
步骤:导入,定义,导出
computed的高级用法:
格式:
const 计算属性 = computed({ get () { // 当获取值自动调用 }, set (val) { // 当设置值自动调用,val会自动传入 } })
示例代码:
<template> <div style="padding:2em"> <p>小花, 月薪:{{salary}}, 年薪:{{total}}</p> <p>年薪:<input v-model="total"/></p> <button @click="double">月薪double</button> </div> </template> <script> // reactive: 是除了ref之外的第二种申明响应式数据的方式 import { ref, computed } from 'vue' export default { setup () { const salary = ref(18000) const double = () => { salary.value *= 2 console.log(salary) } // 定义计算属性: 普通的写法:只使用了get // const total = computed(() => { // return stu.salary * 12 // }) // 定义计算属性: 高阶的写法:使用了get + set const total = computed({ get() { return salary.value * 12 }, set(val) { // 设置计算属性的值,会自动调用,并传入val console.log('要设置的值...', val) salary.value = val/12 } }) return { double, salary, total} } } </script>
总结:
计算属性两种用法
给computed传入函数,返回值就是计算属性的值
给computed传入对象,get获取计算属性的值,set监听计算属性改变
在v-model绑定计算属性: <input v-model="total" />
基于响应式数据的变化执行回调逻辑,和vue2中的watch的应用场景完全一致。
步骤:
导入 import { watch } from 'vue'
开启监听。在setup函数中执行watch函数开启对响应式数据的监听
watch函数接收三个常规参数 watch(source, callback, [options])
第一个参数有三种取值:
对象,要监听的响应式数据
数组,每个元素是响应式数据
函数,返回你要监听变化的响应式数据
第二个参数是:响应式数据变化之后要执行的回调函数
第三个参数是: 一个对象,在里面配置是否开启立刻执行或者深度监听
<template> <div> {{stu}}, {{salary}} <button @click="doSome"> do</button> </div> </template> <script> import { reactive, watch, ref } from 'vue' export default { setup() { const salary = ref(10000) const stu = reactive({ address: {city: 'wuhan'} }) // 1. 侦听-单个数据 watch(salary, (newVal, oldVal) => { console.log('监听单个数据', newVal, oldVal) }) // 侦听-单个数据 watch(stu, (newVal, oldVal) => { console.log('监听单个数据', newVal, oldVal) }) // 侦听-多个数据 watch([stu, salary], (newVal, oldVal) => { console.log('监听多个数据', newVal, oldVal) }) // 侦听对象的某个属性 watch(()=>stu.address , (newVal, oldVal) => { console.log('第一个参数是函数', newVal, oldVal) }, {deep: true, immediate: true} ) // 测试按钮,修改数据 const doSome = () => { salary.value +=1 stu.address.city = '' } return {stu, salary, doSome} } } </script>
总结:
作用:watch用来侦听数据的变化。
格式:watch(数据|数组|get函数,(新值,旧值)=>{回调处理逻辑}, {immediate:true|false, deep: true|false})
以上,我们了解了vue2和vue3使用方法的不同,关于组件通讯和插槽等可以看下一篇。
【相关推荐:《vue.js教程》】
以上がVue3.0 の新機能と使用法の概要 (整理および共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。