vue3和vue2的區(qū)別及vue3核心語法

一、 vue3和vue2的區(qū)別

  • api的區(qū)別
    vue2:
export default {
    data() {},
    methods:{},
    watch:{},
    mounted() {},
    computed:{},
    filters:{},
    components:{},
    directives:{}
}

vue3

import {ref,computed,onMounted} from 'vue'
setup() {
   const num=ref(0)
   const str=ref('你好!')
   num.value++
   computed(()=>{
          ..........
   })
}
  • vue3底層用的typescript語言編寫,vue2用JavaScript實現(xiàn)
  • vue3雙向綁定proxy和vue2(Object.defineProperty)不同
  • .......

vue3最初開發(fā)的目的:實現(xiàn)代碼關(guān)注點分離,代碼幾何級數(shù)增長帶來的可維護問題

二、vue3核心語法

2.1 組合式api

  • ref

    • 通常定義基本類型或數(shù)組類型的變量或常量

    • 例如:

      import {ref} from 'vue'
      let num = ref(10);
      let str = ref('hello world')
      let arr = ref([{ id: 1, name: 'jack' }, { id: 2, name: 'alice' }])
      
    • 如何操作dom[通常vue很少操作dom]

      • 給dom定義ref名稱

        <button ref="btn" @click="changeValue">修改值</button><
        
      • 定義一個ref常量

        //定義dom操作對象
        const btn = ref(null)
        
      • 然后通過常量.value.style.css屬性名

         btn.value.style.width='300px'
        
  • reactive

    • reactive主要用于復(fù)雜對象類型

    • 例如:

      //定義用戶信息
      const obj = reactive({
        username: '張三',
        age: 20,
        address: '北京',
        hobby: ['音樂', '刷抖音'],
         
      })
      
  • toRef

    • 可以將reactive定義的響應(yīng)式對象中的某個屬性單獨提取成ref定義的形式

    • 例如:

      const obj = reactive({
        username: '張三',
        age: 20,
        address: '北京',
        hobby: ['音樂', '刷抖音'],
         
      })
      
      const mingzi=toRef(obj,'username')
      
      模板:
      
      {{ mingzi }}
      
  • toRefs

    • 可以將reactive定義的對象屬性全部提取出來轉(zhuǎn)換成ref形式

    • 例如:

      //定義用戶信息,reactive主要用于復(fù)雜對象類型
      const obj = reactive({
        username: '張三',
        age: 20,
        address: '北京',
        hobby: ['音樂', '刷抖音'],
         
      })
      
      //toRefs
      const {username,age,address,hobby}=toRefs(obj)
      
    • computed

      • 可以將ref,reative定義的變量或常量,通過計算屬性生成一個新的可響應(yīng)式的值(ref)

      • 例如:

        //計算屬性
        const total = computed(() => {
        
          let res = 0;
          arr.value.forEach(item => {
            res+=item.num
           })
        
          return res
        
        })
        

      通常computed只能讀取(默認支持get),不能修改,如果想修改,必須通過set方式

      例如:

      const fullname = computed({
        get: () => { 
          return firstname.value+lastname.value
        },
        set: (val) => {
          firstname.value = val[0]
          lastname.value=val.slice(1)
        }
      })
      
    • watch

      • 數(shù)據(jù)改變時,才監(jiān)聽數(shù)據(jù)的變化

      • 例如:

        //監(jiān)聽ref
        //watch(監(jiān)聽目標,回調(diào))
        watch(firstname, (newV, oldV) => {
          console.log('新值:',newV)
          console.log('舊值:', oldV)
        
        })
        
        //監(jiān)聽reactive
        watch(()=>obj.username, (newV,oldV) => {
           console.log('obj.username新值:',newV)
          console.log('obj.username舊值:', oldV)
        })
        
        
    • watchEffect

      • 進行頁面立即觸發(fā)監(jiān)聽

      • 例如:

        watchEffect(() => {
          console.log('進入立馬監(jiān)聽:',firstname.value)
        })
        
    • nextTick

      • 由于數(shù)據(jù)改變,dom并未更新,如果要拿到dom更新之后的結(jié)果,需要通過nextTick來解決
      • 應(yīng)用場景:
        • 商品列表滾動
        • 數(shù)據(jù)更新,要對dom做一些操作時使用
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容