Vue3.0 を使用して得た知識ポイント (2)
# 毎日残業して毎日忙しく、需要は虎か狼のように来ます。試験問題は山のように積まれて、がっかりして帰ってきました。
関連学習の推奨事項: javascript
最近、Vue3.0
関連の知識を勉強しています。 work 、Vue3.0
はまだ rc
バージョンですが、これは私たちの研究には影響しません。今日の記事は Vue3.0
に関する記事の 4 回目です。前回の記事では、vite
と vuecli
を通じて Vue3.0
開発環境を構築する方法を説明し、その後 Vue3.0# を紹介しました。
##setup,
reactive,
ref など。今日の記事では主に
- Vue3の内容について説明します。 0
- Vue3.0
で使用されます 計算プロパティで使用されます
- Vue3.0
で使用されます
vue-router - Vue3.0 で使用されている
vuex
この記事を始める前に、エディターが提供する Vue3.0 開発環境が作成されました。ウェアハウスのアドレスは gitee.com/f_zijun/vue… です。ぜひご利用ください。この記事は、
Vue と
Interview に焦点を当てた公開アカウントである [Front-end Youdewan] で最初に公開されました。終わりよーで】プレイ】。同時に、次のリンクをクリックして、
Vue3.0
# について学びましょう。 ##使用方法
vite Vue3.0
学習環境を構築する
での watch
watch の使用は、Vue3.0
における新しい概念ではありません。 # When ##Vue2.x を使用する場合、
watch を使用して、
Vue インスタンス上の式または関数の計算結果の変更を監視することがよくあります。
Review
watch
Vue2.0 では
watch
式や関数の計算結果の変化を監視できます次の複数のメソッドを使用して Vue インスタンスにアクセスします。以下にそのいくつかのリストを示します。
最も一般的な使用方法
export default { data() { return { name: '子君', info: { gzh: '前端有的玩' } } }, watch: { name(newValue, oldValue) { console.log(newValue, oldValue) }, 'info.gzh': { handler(newValue, oldValue) { console.log(newValue, oldValue) }, // 配置immediate会在watch之后立即执行 immediate: true } } }复制代码
- watch
- プロパティで監視されるように
Vue
インスタンスのプロパティを構成するか、.
を使用して監視キー パスを介して特定の属性の変更を監視することができます。ネスト レベルがどれほど深くても、
immediateを設定し、
deepを設定してオブジェクト内のプロパティを深く監視することで、監視直後にオブジェクトをトリガーすることもできます。
$watch
- 従来の
watch
オブジェクトの記述方法に加えて、
Vue$watch
メソッドがインスタンスで提供されており、これを使用して特定の属性の変更をより柔軟に監視できます。たとえば、このシナリオではフォームがあり、ユーザーがフォームを変更した後のフォーム内のデータの変更を監視したいと考えています。ただし、フォームのバックフィル データが非同期でリクエストされるという特別なシナリオがあります。この時点では、バックグラウンドでデータをリクエストした後の変更を監視したいと考えています。この場合、
$watch を使用できます。。次のコードに示すように:
export default { methods: { loadData() { fetch().then(data => { this.formData = data this.$watch( 'formData', () => { // formData数据发生变化后会进入此回调函数 }, { deep: true } ) }) } } }复制代码
ログイン後にコピーListening 関数式
リスニング文字列に加えて、
$watch の最初のパラメータも使用できます。これは関数です。関数の戻り値が変化すると、コールバック関数がトリガーされます。 - 上記は、
Vue2.0 で使用する一般的な記述方法です。
,Vue3.0
と部分的に下位互換性があるため、上記の使用法は基本的にの場合、
Vue2.0Vue3.0
# で使用されますで使用できます。ただし、
Vue3.0の大きなハイライトは
composition APIです。そのため、
Vue2.0の記述方法に加えて、
を使用することもできます。 apiで提供されているコンポーネント
watchは
Vue3.0watch
#Vue3.0
this.$watch(() => this.name, () => { // 函数的返回值发生变化,进入此回调函数})复制代码
Vue2.0 の記述方法に加えて、データの変更を監視できる
api が 2 つあります。 ##watch
、2 つ目は
watchEffect です。 watch
の場合、その使用法は基本的に Vue2.0
の $watch
と同じですが、watchEffect
は Vue3.0 です。
新しく提供されたapi
watchの使用法
次の例は、
watch
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>import { watch, ref, reactive } from &#39;vue&#39;export default {
setup() { const name = ref(&#39;子君&#39;) const otherName = reactive({ firstName: &#39;王&#39;, lastName: &#39;二狗&#39;
})
watch(name, (newValue, oldValue) => { // 输出 前端有的玩 子君
console.log(newValue, oldValue)
}) // watch 可以监听一个函数的返回值
watch( () => { return otherName.firstName + otherName.lastName
},
value => { // 当otherName中的 firstName或者lastName发生变化时,都会进入这个函数
console.log(`我叫${value}`)
}
)
setTimeout(() => {
name.value = &#39;前端有的玩&#39;
otherName.firstName = &#39;李&#39;
}, 3000)
}
}复制代码</pre><div class="contentsignin">ログイン後にコピー</div></div>
##の使用方法を示しています。 #watch次のコードに示すように、単一の値または関数の戻り値を監視するだけでなく、複数のデータ ソースを同時に監視することもできます。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>export default {
setup() { const name = ref(&#39;子君&#39;) const gzh = ref(&#39;前端有的玩&#39;)
watch([name, gzh], ([name, gzh], [prevName, prevGzh]) => { console.log(prevName, name) console.log(prevGzh, gzh)
})
setTimeout(() => {
name.value = &#39;前端有的玩&#39;
gzh.value = &#39;关注我,一起玩前端&#39;
}, 3000)
}
}复制代码</pre><div class="contentsignin">ログイン後にコピー</div></div><h5 id="watchEffect的用法">watchEffect的用法</h5><p><code>watchEffect
的用法与watch
有所不同,watchEffect
会传入一个函数,然后立即执行这个函数,对于函数里面的响应式依赖会进行监听,然后当依赖发生变化时,会重新调用传入的函数,如下代码所示:
import { ref, watchEffect } from 'vue'export default { setup() { const id = ref('0') watchEffect(() => { // 先输出 0 然后两秒后输出 1 console.log(id.value) }) setTimeout(() => { id.value = '1' }, 2000) } }复制代码
停止执行
Vue2.0
中的$watch
会在调用的时候返回一个函数,执行这个函数可以停止watch
,如下代码所示const unwatch = this.$watch('name',() => {})// 两秒后停止监听setTimeout(()=> { unwatch() }, 2000)复制代码
ログイン後にコピー在
Vue3.0
中,watch
与watchEffect
同样也会返回一个unwatch
函数,用于取消执行,比如下面代码所示export default { setup() { const id = ref('0') const unwatch = watchEffect(() => { // 仅仅输出0 console.log(id.value) }) setTimeout(() => { id.value = '1' }, 2000) // 1秒后取消watch,所以上面的代码只会输出0 setTimeout(() => { unwatch() }, 1000) } }复制代码
ログイン後にコピー清除副作用
想象一下这样的一个场景,界面上面有两个下拉框,第二个下拉框的数据是根据第一个下拉框的数据联动的,当第一个下拉框数据发生变化后,第二个下拉框的数据会通过发送一个网络请求进行获取。这时候我们可以通过
watchEffect
来实现这个功能,比如像下面代码这样import { ref, watchEffect } from 'vue'function loadData(id) { return new Promise(resolve => { setTimeout(() => { resolve( new Array(10).fill(0).map(() => { return id.value + Math.random() }) ) }, 2000) }) }export default { setup() { // 下拉框1 选中的数据 const select1Id = ref(0) // 下拉框2的数据 const select2List = ref([]) watchEffect(() => { // 模拟请求 loadData(select1Id).then(data => { select2List.value = data console.log(data) }) }) // 模拟数据发生变化 setInterval(() => { select1Id.value = 1 }, 3000) } }复制代码
ログイン後にコピー现在假如我切换了一下第一个下拉框的数据之后,这时候数据请求已经发出,然后我将这个页面切换到另一个页面,因为请求已经发出,所以我希望在页面离开的时候,可以结束这个请求,防止数据返回后出现异常,这时候就可以使用
watchEffect
为第一个回调函数传入的入参来处理这个情况,如下代码所示function loadData(id, cb) { return new Promise(resolve => { const timer = setTimeout(() => { resolve( new Array(10).fill(0).map(() => { return id.value + Math.random() }) ) }, 2000) cb(() => { clearTimeout(timer) }) }) }export default { setup() { // 下拉框1 选中的数据 const select1Id = ref(0) // 下拉框2的数据 const select2List = ref([]) watchEffect(onInvalidate => { // 模拟请求 let cancel = undefined // 第一个参数是一个回调函数,用于模拟取消请求,关于取消请求,可以了解axios的CancelToken loadData(select1Id, cb => { cancel = cb }).then(data => { select2List.value = data console.log(data) }) onInvalidate(() => { cancel && cancel() }) }) } }复制代码
ログイン後にコピー
Vue3.0
中使用计算属性
想一想在Vue2.0
中我们一般会用计算属性做什么操作呢?我想最常见的就是当模板中有一个复杂计算的时候,可以先使用计算属性进行计算,然后再在模板中使用,实际上,Vue3.0
中的计算属性的作用和Vue2.0
的作用基本是一样的。
在
Vue2.0
中使用计算属性computed: { getName() { const { firstName, lastName } = this.info return firstName + lastName } },复制代码
ログイン後にコピー
在
Vue3.0
中使用计算属性<template> <p class="about"> <h1>{{ name }}</h1> </p></template> <script> import { computed, reactive } from 'vue' export default { setup() { const info = reactive({ firstName: '王', lastName: '二狗' }) const name = computed(() => info.firstName + info.lastName) return { name } } } </script>复制代码
ログイン後にコピー和
Vue2.0
一样,Vue3.0
的计算属性也可以设置getter
和setter
,比如上面代码中的计算属性,只设置了getter
,即加入cumputed
传入的参数是一个函数,那么这个就是getter
,假如要设置setter
,需要像下面这样去写export default { setup() { const info = reactive({ firstName: '王', lastName: '二狗' }) const name = computed({ get: () => info.firstName + '-' + info.lastName, set(val) { const names = val.split('-') info.firstName = names[0] info.lastName = names[1] } }) return { name } } }复制代码
ログイン後にコピー
Vue3.0
中使用vue-router
初始化vue-router
在Vue2.0
中我们使用vue-router
的时候,会通过new VueRouter
的方式去实现一个VueRouter
实例,就像下面代码这样
import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter)const router = new VueRouter({ mode: 'history', routes: [] })export default router复制代码
但到了Vue3.0
,我们创建VueRouter
的实例发生了一点点变化,就像Vue3.0
在main.js
中初始化Vue
实例需要像下面写法一样
import { createApp } from 'vue'createApp(App).$mount('#app')复制代码
vue-router
也修改为了这种函数的声明方式
import { createRouter, createWebHashHistory } from 'vue-router'const router = createRouter({ // vue-router有hash和history两种路由模式,可以通过createWebHashHistory和createWebHistory来指定 history: createWebHashHistory(), routes }) router.beforeEach(() => { }) router.afterEach(() => { })export default router复制代码
然后在main.js
中,通过
createApp(App).use(router)复制代码
来引用到Vue
中
在setup
中使用vue-router
在Vue2.0
中,我们通过this.$route
可以获取到当前的路由,然后通过this.$router
来获取到路由实例来进行路由跳转,但是在setup
中,我们是无法拿到this
的,这也意味着我们不能像Vue2.0
那样去使用vue-router
, 此时就需要像下面这样去使用
import { useRoute, useRouter } from 'vue-router'export default { setup() { // 获取当前路由 const route = useRoute() // 获取路由实例 const router = useRouter() // 当当前路由发生变化时,调用回调函数 watch(() => route, () => { // 回调函数 }, { immediate: true, deep: true }) // 路由跳转 function getHome() { router.push({ path: '/home' }) } return { getHome() } } }复制代码
上面代码我们使用watch
来监听路由是否发生变化,除了watch
之外,我们也可以使用vue-router
提供的生命周期函数
import { onBeforeRouteUpdate, useRoute } from 'vue-router'export default { setup() { onBeforeRouteUpdate(() => { // 当当前路由发生变化时,调用回调函数 }) } }复制代码
除了onBeforeRouteUpdate
之外,vue-router
在路由离开的时候也提供了一个生命周期钩子函数
onBeforeRouteLeave(() => { console.log('当当前页面路由离开的时候调用') })复制代码
Vue3.0
中使用vuex
其实vuex
在Vue3.0
中的使用方式和vue-router
基本是一致的
初始化vuex
首先新建store/index.js
,然后添加如下代码
import { createStore } from 'vuex'export default createStore({ state: {}, mutations: {}, actions: {} })复制代码
然后在main.js
中,通过以下方式使用
createApp(App).use(store)复制代码
在setup
中使用vuex
和useRouter
一样,vuex
也提供了useStore
供调用时使用,比如下面这段代码
import { useStore } from 'vuex'export default { setup() { const store = useStore() const roleMenus = store.getters['roleMenus'] return { roleMenus } } }复制代码
其余的使用方式基本和Vue2.0
中的用法是一致的,大家具体可以参考vuex
官方文档
Vue3.0中的生命周期钩子函数
在前文中,我们说到Vue3.0
是兼容一部分Vue2.0
的,所以对于Vue2.0
的组件写法,生命周期钩子函数并未发生变化,但是假如你使用的是componsition api
,那么就需要做一部分调整
取消
beforeCreate
与created
在使用
componsition api
的时候,其实setup
就代替了beforeCreate
与created
,因为setup
就是组件的实际入口函数。beforeDestroy
与destroyed
改名了在
setup
中,beforeDestroy
更名为onBeforeUnmount
,destroyed
更名为onUnmounted
将生命周期函数名称变为
on+XXX
,比如mounted
变成了onMounted
,updated
变成了onUpdated
在setup
中使用生命周期函数的方式
setup() { onMounted(() => { console.log('mounted!') }) onUpdated(() => { console.log('updated!') }) onUnmounted(() => { console.log('unmounted!') }) }复制代码
实际用法与Vue2.0
基本是一致的,只是写法发生了变化,所以学习成本是很低的。
总结
这是小编关于Vue3.0
的第四篇文章,每一篇文章都是自己在学习中做的一些总结。小编整理了一个vue3.0
的开发环境,仓库地址为 gitee.com/f_zijun/vue…,内部集成了typescript
,eslint
,vue-router
,vuex
,ant desigin vue
等,希望可以帮到正在学习Vue3.0
的你,同时关注公众号【前端有的玩】,带给你不一样的惊喜。喜欢本文,可以给小编一个赞哦。
结语
不要吹灭你的灵感和你的想象力; 不要成为你的模型的奴隶。 ——文森特・梵高
以上がVue3.0 を使用して得た知識ポイント (2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

この記事では、ソースマップを使用して、元のコードにマッピングすることにより、Minified JavaScriptをデバッグする方法について説明します。ソースマップの有効化、ブレークポイントの設定、Chrome DevtoolsやWebpackなどのツールの使用について説明します。

エントリーレベルのタイプスクリプトチュートリアルをマスターしたら、TypeScriptをサポートするIDEで独自のコードを作成し、JavaScriptにコンパイルできるはずです。このチュートリアルは、TypeScriptのさまざまなデータ型に飛び込みます。 JavaScriptには、NULL、未定義、ブール値、数字、文字列、シンボル(ES6によって導入)とオブジェクトの7つのデータ型があります。 TypeScriptはこれに基づいてより多くのタイプを定義し、このチュートリアルではすべてを詳細に説明します。 ヌルデータ型 JavaScriptのように、Typescriptのnull

この記事では、Javaのコレクションフレームワークの効果的な使用について説明します。 データ構造、パフォーマンスのニーズ、スレッドの安全性に基づいて、適切なコレクション(リスト、セット、マップ、キュー)の選択を強調しています。 コレクションの使用を効率的に最適化します

このチュートリアルでは、chart.jsを使用してパイ、リング、およびバブルチャートを作成する方法について説明します。以前は、4つのチャートタイプのchart.js:ラインチャートとバーチャート(チュートリアル2)、およびレーダーチャートと極地域チャート(チュートリアル3)を学びました。 パイとリングチャートを作成します パイチャートとリングチャートは、さまざまな部分に分かれている全体の割合を示すのに理想的です。たとえば、パイチャートを使用して、サファリの男性ライオン、女性ライオン、若いライオンの割合、または異なる候補者が選挙で受け取る票の割合を示すことができます。 パイチャートは、単一のパラメーターまたはデータセットの比較にのみ適しています。パイチャートのファンの角度はデータポイントの数値サイズに依存するため、パイチャートは値のあるエンティティをゼロ値で描画できないことに注意してください。これは、割合がゼロのエンティティを意味します
