vue3組件內寫法的變化(核心篇2)——vue2和vue3的基礎用法對比第五篇


組件中的使用:常用屬性、方法等的對比

(1) 生命周期 (2) 變量的定義與使用 (3) 方法的定義與使用 (4) 父子組件間的數據交互  (5) computed計算屬性和watch的使用

其中(1)(2)(3)已在上篇文章中介紹,本篇文章將介紹(4)、(5)

(4) 父子組件間的數據交互

寫法基本沒變,只是子組件接收的方式有小變化,所以vue2的寫法就不具體描述了

1) 父傳子 props用法

vue2在子組件的寫法,是聲明了傳值的屬性名后在方法中用 this.傳值的屬性名 就可以使用了,

只有這點與vue3有區別其它的都一樣,下面為vue3寫法。

 
         
父組件中:<子組件名稱 
      傳值的屬性名="傳值的值"
      傳值的屬性名2="傳值的值2"
     />
在子組件中:
<template>
  {{傳值的屬性名}}
</template>
1.普通寫法
<script>
export default defineComponent({  
  // 對傳的值不限制
  props:[
傳值的屬性名,傳值的屬性名2]
  // 對傳的值進行限制
  props:{
    傳值的屬性名:{
      type:number, // 值的類型
      default:100, // 默認值
    },
    傳值的屬性名2:{
      type:number,
      required:true, // 是否必傳
    }
  }
  // 注意props不能結構,不然會破壞其響應性
  // 從這個里開始vue2和vue3有區別,其他的都一樣
  set(props){
    props.傳值的屬性名
    props.傳值的屬性名2 // 使用
  }
}
</script>
2.使用setup語法糖
<script setup>
defineProps([傳值的屬性名])
defineProps({
  傳值的屬性名:{
    type:number,
    required:true
  }
})
調用直接寫傳值的屬性名就行。如傳的是list ,就直接寫list就是使用了
</script>

 

2) 子傳父 emit用法;

在vue2中是直接在子組件中用 this.$emit(傳值的方法名,參數) 就調用了,

不用聲明什么,這點和vue3有點區別,下面為vue3寫法。

父組件中:<子組件名稱 
      @傳值的方法名="父組件中的函數"
      @傳值的方法名2="父組件的函數2"
     />
在子組件中:
1.普通方式
<script>
export default defineComponent({  
  emit:[傳值的方法名,傳值的方法名2]
  // content可以解構
// 這個為content不解構寫法
  set(props,content){
    content.emit(傳值的方法名)
    content.emit(傳值的方法名2,參數) // 調用
  }
  // content解構寫法
  set(props,{emit}){
    emit(傳值的方法名)
    emit(傳值的方法名2,參數) // 調用
  }
}
</script>
2.使用setup語法糖
<script setup>
const emit = defineEmits([傳值的方法名,傳值的方法名2])
emit(傳值的方法名)
emit(傳值的方法名,參數) // 調用
</script>

3)父主動獲取子信息:ref,子主動獲取父信息:$parent

因為和vue2沒區別就不再詳細說明了 ,

但有一個需要注意,vue3在子組件中,需要把方法或變量暴露出來給父組件,否則父組件將無法獲取到,無法使用

暴露方式:defineExpose( { 變量/方法 } )

父獲取子 proxy.$refs.ref的名字.對應變量或方法

子獲取父 proxy.$parent.對應變量或方法 

 

(5) computed計算屬性和watch的使用

1) computed的使用,computed為計算屬性,一定要return一個結果。

在return的值變化時會自動調用且重新計算並更新數據,可以主動調用,

但是只在return的值有變化時才重新計算,不然會用緩存里的值。

vue3的寫法
import { computed } from 'vue'
export default defineComponent({
  setup(){
    // 默認寫法
    const 函數名 = computed(()=>{
      return 值
    })
    // 主動更新的寫法
    const 函數名2 = computed(()=>{
      // 默認寫法的獲取值
      get:()=>{
        return 值
      },
      // 主動設置
      setter:()=>{
        設置值的代碼
      }
    })
    return{
      函數名,
      函數名2
    }
  }
})
// vue2的寫法 因為里面的寫法都是一樣的,所以主動更新的寫法就不再寫了
export default{
  computed:{
    函數名(){
      return 值
    }
  }
}

2)watch的使用,watch為監聽屬性,監聽到變量變化后調用其內函數做點什么操作,

不能主動調用,沒有緩存,不一定要return。

vue3寫法
import { watch,watchEffect } from 'vue'
export default defineComponent({
  // vue3中監聽變量可以是多個,所以監聽變量有多種寫法
  // 1.監聽一個變量:變量名
  // 2監聽多個變量可以寫為:[變量1,變量2]
  // 3.監聽對象屬性的:()=>{ 對象.對象屬性 }
  watch(監聽變量,(newValue,oldValue)=>{
    對應操作
  },{immediate:true,deep:true})
  // vue3多了個watchEffect,成為watch的副作用,其與computed有點像,
  // 但是其注中的過程,可以不需要return,用到哪個屬性就監聽哪個屬性
  // 每次修改變量都會執行副作用
  watchEffect(()=>{
    const 變量名 = xx
    console.log(變量名)
  })
})

// vue2寫法 監聽變量的變化進行操作
export default{
  data(){
    return{
      變量名:值
    }
  },
  watch:{
    變量名(newValue,oldValue){
      對應操作代碼
    },
    immediate:true, // 是否初始化就執行一次
    deep:true, // 是否開啟深層次監聽
  } 
}

 注意:computed是注重結果,watch是在於做點什么,所以一般純計算的用computed,需要發送請求或者其它復雜操作的用watch

 

作者:博客園-DDjans,轉載時請注明來源。

(請勿將文章用在任何商業用途,違者將承擔相應法律責任)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM