大家好,首先先道個歉。有三個api還不太清楚是怎么回事。所以這次分享少分享三個API 事后等我搞清楚了我在增加上
欠三個api:
shallowReactive
shallowReadonly
shallowRef
這三個記錄下,下面開始正題:
customRef
這個api是用來顯式控制其依賴項跟蹤和更新觸發,這么說可能有人不理解,說簡單點吧,就是你可以控制你視圖更新時間,以及動態控制你動態處理設置值(比如后面增加一段話)
<p> 自定義ref : {{ testCustom }} </p>
<button @click = "getRef">
獲取ref值
</button>
<button @click = "setRef">
設置ref值
</button>
import { customRef } from 'vue'
setup () {
// 顯式控制其依賴項跟蹤和更新觸發
function customRefTest(value) {
return customRef((track, trigger) => {
return {
get() {
track()
return value
},
set (newValue) {
value = newValue + '自定義ref'
setTimeout(() => {
trigger()
}, 10000)
}
}
})
}
const testCustom = customRefTest(0)
const getRef = () => {
console.log(testCustom.value)
}
const setRef = () => {
testCustom.value = '設置ref值'
}
}
順便貼一下官網的demo,一個節流的輸入框雙向數據綁定
<template>
<div>
<input v-model="text" />
{{ text }}
</div>
</template>
<script>
import { customRef } from 'vue'
function useDebouncedRef(value, delay = 200) {
let timeout
return customRef((track, trigger) => {
return {
get() {
track()
return value
},
set(newValue) {
clearTimeout(timeout)
timeout = setTimeout(() => {
value = newValue
trigger()
}, delay)
}
}
})
}
export default {
setup() {
return {
text: useDebouncedRef('hello')
}
}
}
</script>
<style scoped>
</style>
markrow
標記對象,使其永遠不會轉換為代理。返回對象本身
{{ a }} <button @click = "setFoo"> 設置foo值 </button> import { markRaw, reactive, isReactive } from 'vue' const foo = markRaw({ a: 10 }) const state = reactive(foo) console.log(isReactive(state)) // false const setFoo = () => { state.a++ console.log(foo) }
注意,說明一下這里我點擊這個button,視圖是不會改變的,始終顯示10。但是js中直接輸出是最新的值
toRaw
返回一個代理對象(包含只讀代理對象)的原對象,可用於臨時讀取,而不會觸發代理訪問和跟蹤的一個開銷。引用vue官網原話:返回反應或只讀代理的原始對象。這是一個轉義填充,可用於臨時讀取,而不會引起代理訪問/跟蹤開銷或寫入而不會觸發更改。不建議保留對原始對象的持久引用。小心使用。
import { markRaw, reactive, toRaw } const foo = markRaw({ a: 10 }) const state = reactive(foo) const toRawTest = reactive(fooTest) const setShallowReactive = () => { console.log('toraw測試' + (toRaw(toRawTest) === fooTest)) // true console.log('toraw測試2' + (toRaw(state) === foo)) // true }
render函數 && jsx
基本和vue2沒什么太大區別,都是一樣的用法,只不過不需要使用render函數,但是需要從vue中導入一個h
import { h, ref } from 'vue'
export default {
setup() {
const msg = ref(1)
return () =>h('h1', [msg.value])
}
}
至此,compositionapi所有用法已經基本可以告一段落,下一次為大家分享內容大概為:Fragments、Suspense以及Multiple v-models、和Portals組件,都是一些小用法的改變,請期待吧
