vue3的基本使用

vue3的基礎使用;
安裝vite:npm inistall -g create-vite-app
利用vite創建vue3項目:create-vite-app projectName
安裝依賴運行項目:cd projectName npm install npm run dev
文檔地址:https://v3.vuejs.org/guide/introduction.html

composition API的本質其實就是把setup()中的方法和數據註冊到data/methods中;
ref定義簡單類型的數據, reactive定義複雜類型的數據;
vue3基本使用方式

import {ref , reactive} from 'vue' // reactive只有傳入複雜類型(json/arr)纔會成爲響應式
export default {
  name: 'App',
  // setup函數是組合api的入口函數
  // 執行時機在beforeCreate之前,所以此時是無法使用data/methods
  // 由於不能在setup不能訪問data/methods,此時的this的值爲undefined
  // setup只能是同步的
  setup () {
    let {state, deleteLine} = diyFun()
    let count =  ref(0)
    return {state, deleteLine, count} // 暴露出去之後就可以使用這些變量了
  }
}
function diyFun() {
  let state = reactive({
    stus: [
      {id: 1, name: 2, age: 3},
      {id: 2, name: 3, age: 4},
      {id: 3, name: 4, age: 5},
      {id: 4, name: 5, age: 6}
    ]
  })
  function deleteLine(index) {
    console.log(index)
    state.stus.splice(index, 1)
  }
  return {state, deleteLine}
}

reactive注意點:
reactive傳遞的參數必須是object/arr
如果傳遞了其他的對象,默認情況下修改對象,界面不會自動更新,如果想要
更新,可以通過重新賦值的方式

// 重新賦值
function changeTime() {
  let stateDate = reactive({
    time: new Date()
  })
  function changeDetail() {
    let data = new Date(stateDate.time.getTime())
    data.setDate(stateDate.time.getDate() + 1)
    stateDate.time = data
  }
  return {stateDate, changeDetail}
}

ref的本質其實還是reactive,當我們給ref函數傳遞一個值之後,ref
函數會自動的轉化成{value: xx},只是中間自動幫我們套了一層value
const name = ref(1) => name: {value: 1}
所以當我們修改值時,name.value = ‘xxx',此時才能進行響應式更新.
同理: shallowRef本質上也是shallowReactive

遞歸監聽(通過ref和reactive來創建得數據)
在多層嵌套得對象中,vue3會遞歸每一層對象,並對每一層對象創建一個proxy進行監聽,所以非常消耗性能,

  let obj = reactive({
      a: {
          b: 'v',
          c: {
              d: '666',
              e: {
                  f: '7777'
              }
          }
      }
  })

非遞歸監聽 shallowReactive shallowRef, 只會監聽最外一層
修改, 單獨修改obj.a.b是不會重新渲染得,因爲是沒有被proxy監聽得,
只有同時修改了obj得第一層屬性值纔會重新渲染,只有obj被proxy監聽了

let obj = shallowReactive({
      name: '11111',
      a: {
          b: 'v',
          c: {
              d: '666',
              e: {
                  f: '7777'
              }
          }
      }
  })
 // 修改, 單獨修改obj.a.b是不會重新渲染得,因爲是沒有被proxy監聽得,
// 只有同時修改了obj得第一層屬性值纔會重新渲染,只有obj被proxy監聽了
obj.name = 'zhangsan'
obj.a.b = '7777777'

通過shallowRef創建得數據,監聽得是obj.value得值,修改方式如下,將整個對象提出來修改
如果只想單獨修改一個值, 配合triggerRef(obj)使用,此時會重新渲染界面
注意:沒有triggerReactive()方法

obj.value = {
            name: 'asdasdasd',
            a: {
                b: 'asdasdasd',
                c: {
                    d: '66132126',
                    e: {
                        f: '7123123777'
                    }
                }
            }
        }

// 如果只想單獨修改一個值, 配合triggerRef(obj)使用,此時會重新渲染界面
// 注意:沒有triggerReactive()方法
obj.value.name = 'asdasdasd123123'
triggerRef(obj)

toRaw方法,在有些情況下,我們修改了reactive/ref中得數據得時候,並不希望他去更新UI
但是他本身是響應式得,此時可以使用toRaw來避免這種更新達到提升性能得作用
reactive創建得數據

let obj2 = toRaw(obj)
obj2.name  = '123123123123' // 此時obj中proxy代理得值也發生變化了,但是界面沒有更新
//  ref創建得數據想使用toRow得話
let obj2 = toRaw(obj.value) // 因爲ref本質還是reactive
obj2.name  = '123123123123'

markRow 使某個值永遠不會響應式

let obj = {a: 1, b: 2}
obj = markRow(obj)
let state = reactive(obj) //此時state的值再發生修改就不會重新渲染了

toRef和ref定義數據

let obj = {a: 1, b: 2}
let state = ref(obj.a)
let state = toRef(obj, name)
/*
此時修改state.value的值。obj中對應的a的值不會更改,但是UI會自動更新
如果使用的是toRef,在修改了數據之後,obj的值會跟着變化,但是UI不會更新
*/

也可以使用toRefs

let state = toRefs(obj) // 直接遍歷obj中所有的屬性,作用和toRef差不多,修改原始數據

vue3中使用生命週期函數和獲取dom得方式
使用生命週期->引入對應得生命週期函數,在setup中使用onMounted()

//       <div ref="box"> 123123123</div>
let box = ref(null) // 定義一個空的ref數據,將該數據暴露出去給節點綁上ref值
onMounted(() => {
  console.log(box.value) // 即可拿到節點對象
})
return {box}
readonly:創建一個只讀的數據,並且是遞歸只讀
let state = readonly({name: 1, attr: {a:1, b: 2})
shallowReadonly:用於創建一個只讀的數據,但不是遞歸只讀的,只能用於第一層
isReadonly()用於判斷該值是不是隻讀的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章