Vue3中的計算屬性及偵聽器怎麼使用
計算屬性
我們知道,在模板中可以直接透過插值語法顯示一些data中的數據,但是在某些情況,我們可能需要對數據進行一些轉換後再顯示,或者需要將多個資料結合起來進行顯示
在模板中使用表達式,可以非常方便的實現,但是設計它們的初衷是用於簡單的運算,在模板中放入太多的邏輯會讓模板過重和難以維護,如果多個地方都使用到,那麼會有大量重複的程式碼
所以我們希望將業務邏輯和UI介面進行分離,其中一種方式就是將邏輯抽取到一個在method中,但這種做法有以下弊端
所有的data使用過程都會變成了一個方法的呼叫
- ##多次取得數據,需要多次調用方法,執行對應的邏輯,沒有緩存
對於任何包含響應式數據的複雜邏輯,你都應該使用計算屬性
<div id="app"> <!-- 计算属性的使用和普通状态的使用方式是一致的 --> <h3>{{ fullname }}</h3> </div> <script> Vue.createApp({ data() { return { firstname: 'Klaus', lastname: 'Wang' } }, computed: { fullname() { return this.firstname + ' ' + this.lastname } } }).mount('#app')
<div id="app"> <!-- 计算属性的使用和普通状态的使用方式是一致的 --> <h3>{{ fullname }}</h3> <button @click="change">change</button> </div> <script> Vue.createApp({ data() { return { firstname: 'Klaus', lastname: 'Wang' } }, methods: { change() { this.fullname = 'Alex Li' } }, computed: { // 计算属性的完整写法 fullname: { get() { return this.firstname + ' ' + this.lastname }, set(v) { this.firstname = v.split(' ')[0] this.lastname = v.split(' ')[1] } } } }).mount('#app') </script>
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, watch: { // 可以使用watch监听响应式数据的改变 // 对应有两个参数 // 参数一 --- 新值 // 参数二 --- 旧值 info(newV, oldV) { // 如果监听的值是对象,获取到的新值和旧值是对应对象的代理对象 console.log(newV, oldV) // 代理对象 转 原生对象 // 1. 使用浅拷贝获取一个新的对象,获取的新的对象为原生对象 console.log({...newV}) // 2. 使用Vue.toRaw方法获取原生对象 console.log(Vue.toRaw(newV)) } }, methods: { change() { this.info = { name: 'Steven' } } } }).mount('#app')
說明 | |
---|---|
是否開啟深度監聽 | 值為boolean未開啟的時候,如果監聽的是對象,那麼只有對象的參考發生改變的時候,才會觸發watch回呼 開始後,如果監聽的是對象,那麼只要對像中的任一個屬性發生了改變,就會觸發watch回調 |
是否立即開始監聽 | 預設情況下,初次渲染是不會觸發watch監聽,只有當值改變後,才會觸發watch監聽將immediate設定為true後,初次渲染也會觸發watch監聽,此時oldValue的值為undefined |
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>watch: {
&#39;info.name&#39;(newV, oldV){
console.log(newV, oldV)
}
}</pre><div class="contentsignin">登入後複製</div></div>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>Vue.createApp({
data() {
return {
info: {
name: &#39;Klaus&#39;
}
}
},
watch: {
// watch的值如果是一个字符串的时候
// 会自动以该字符串作为函数名去methods中查找对应的方法
&#39;info.name&#39;: &#39;watchHandler&#39;
},
methods: {
change() {
this.info.name = &#39;Steven&#39;
},
watchHandler(newV, oldV){
console.log(newV, oldV)
}
}
}).mount(&#39;#app&#39;)</pre><div class="contentsignin">登入後複製</div></div>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>Vue.createApp({
data() {
return {
info: {
name: &#39;Klaus&#39;
}
}
},
watch: {
&#39;info.name&#39;: [
&#39;watchHandler&#39;,
function handle() {
console.log(&#39;handler2&#39;)
},
{
handler() {
console.log(&#39;handler3&#39;)
}
}
]
},
methods: {
change() {
this.info.name = &#39;Steven&#39;
},
watchHandler(){
console.log(&#39;handler1&#39;)
}
}
}).mount(&#39;#app&#39;)</pre><div class="contentsignin">登入後複製</div></div>
Vue.createApp({
data() {
return {
info: {
name: 'Klaus'
}
}
},
created() {
/*
$watch 参数列表
参数一 --- 侦听源
参数二 --- 侦听回调
参数三 --- 配置对象
*/
this.$watch('info.name', (newV, oldV) => console.log(newV, oldV), {
immediate: true
})
},
methods: {
change() {
this.info.name = 'Steven'
}
}
}).mount('#app')
以上是Vue3中的計算屬性及偵聽器怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

tinymce是一個功能齊全的富文本編輯器插件,但在vue中引入tinymce並不像別的Vue富文本插件一樣那麼順利,tinymce本身並不適配Vue,還需要引入@tinymce/tinymce-vue,並且它是國外的富文本插件,沒有透過中文版本,需要在其官網下載翻譯包(可能需要翻牆)。 1.安裝相關依賴npminstalltinymce-Snpminstall@tinymce/tinymce-vue-S2、下載中文包3.引入皮膚和漢化包在項目public資料夾下新建tinymce資料夾,將下載的

vue3+vite:src使用require動態導入圖片報錯和解決方法vue3+vite動態的導入多張圖片vue3如果使用的是typescript開發,就會出現require引入圖片報錯,requireisnotdefined不能像使用vue2這樣imgUrl:require(' …/assets/test.png')導入,是因為typescript不支援require所以用import導入,下面介紹如何解決:使用awaitimport

想要實現頁面的局部刷新,我們只需要實現局部元件(dom)的重新渲染。在Vue中,想要實現這效果最簡單的方式方法就是使用v-if指令。在Vue2中我們除了使用v-if指令讓局部dom的重新渲染,也可以新建一個空白元件,需要刷新局部頁面時跳轉至這個空白元件頁面,然後在空白元件內的beforeRouteEnter守衛中又跳轉回原來的頁面。如下圖所示,如何在Vue3.X中實現點擊刷新按鈕實現紅框範圍內的dom重新加載,並展示對應的加載狀態。由於Vue3.X中scriptsetup語法中組件內守衛只有o

Vue實作部落格前端,需要實作markdown的解析,如果有程式碼則需要實作程式碼的高亮。 Vue的markdown解析函式庫很多,如markdown-it、vue-markdown-loader、marked、vue-markdown等。這些庫都大同小異。這裡選用的是marked,程式碼高亮的函式庫選用的是highlight.js。具體實現步驟如下:一、安裝依賴庫在vue專案下開啟命令窗口,並輸入以下命令npminstallmarked-save//marked用於將markdown轉換成htmlnpmins

vue3+ts+axios+pinia實作無感刷新1.先在專案中下載aiXos和pinianpmipinia--savenpminstallaxios--save2.封裝axios請求-----下載js-cookienpmiJS-cookie-s//引入aixosimporttype{AxiosRequestConfigig ,AxiosResponse}from"axios";importaxiosfrom'axios';import{ElMess

前言無論是vue還是react,當我們遇到多處重複程式碼的時候,我們都會想著如何重複使用這些程式碼,而不是一個檔案裡充斥著一堆冗餘程式碼。實際上,vue和react都可以透過抽組件的方式來達到復用,但如果遇到一些很小的程式碼片段,你又不想抽到另外一個檔案的情況下,相比而言,react可以在相同文件裡面宣告對應的小元件,或透過renderfunction來實現,如:constDemo:FC=({msg})=>{returndemomsgis{msg}}constApp:FC=()=>{return(

最終效果安裝VueCropper組件yarnaddvue-cropper@next上面的安裝值針對Vue3的,如果時Vue2或想使用其他的方式引用,請訪問它的npm官方地址:官方教程。在元件中引用使用時也很簡單,只需要引入對應的元件和它的樣式文件,我這裡沒有在全域引用,只在我的元件檔案中引入import{userInfoByRequest}from'../js/api' import{VueCropper}from'vue-cropper&

vue3專案打包發佈到伺服器後存取頁面顯示空白1、處理vue.config.js檔案中的publicPath處理如下:const{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({publicPath :process.env.NODE_ENV==='production'?'./':'/&
