91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue3+ts中怎么使用ref與reactive指定類型

發布時間:2022-06-28 14:21:55 來源:億速云 閱讀:2501 作者:iii 欄目:開發技術

今天小編給大家分享一下vue3+ts中怎么使用ref與reactive指定類型的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

ref 的基礎特性

ref 約等于 reactive({ value: x })

ref() 可以定義時無參數,第一次賦值任意類型,然后就不能增加屬性

const refa = ref(6)
const rcta = reactive({ value: 12 })
console.log('refa:', refa) //RefImpl{...}
console.log('refa:', refa.value) //6
console.log('rcta:', rcta) //Proxy {value: 12}
console.log('rcta.value:', rcta.value) //12
const refb = ref({ name: 'bbb' })
console.log('refb:', refb.value, refb.value.name) //Proxy{name: 'bbb'}   bbb
//refb.value.age=18 //報錯 //類型{ name: string;}上不存在屬性age

如何在ref中指定類型

const a = ref('') //根據輸入參數推導字符串類型 Ref<string>
const b = ref<string[]>([]) //可以通過范型顯示約束 Ref<string[]>
const c: Ref<string[]> = ref([]) //聲明類型 Ref<string[]> 
const list = ref([1, 3, 5])
console.log('list前:', list.value)
list.value[1] = 7
console.log('list后:', list.value)
type typPeople = {
  name: string
  age: number
}
const list2: Ref<typPeople[]> = ref([])
console.log('list2-前:', list2.value) //{} 不是空數組,而是空對象
list2.value.push({ name: '小張', age: 18 })
console.log('list2-后:', list2.value[0]) //{name: '小張', age: 18}
********* ref 內部值指定類型 *********
const foo = ref<string | number>('foo')
foo.value = 123
********* 如果ref類型未知,則建議將 ref 轉換為 Ref<T>: *********
function useState<T>(initial: T) {
  const state = ref(initial) as Ref<T>
  return state
}
const item: typPeople = { name: 'aa', age: 18 }
const x1 = useState(item) // x1 類型為: Ref<typPeople>
const x2 = ref(item) //x2 類型為: Ref<{ name:string; age: number;}>
console.log('ref.value:', x1.value, x1.value.name) 
//Proxy{name: 'aa', age: 18}  aa

reactive

返回對象的響應式副本
reactive(x) 必須要指定參數,所以類型就已經確定了,也不能增加屬性

const count = ref(1)
console.log('ref:', count) //RefImpl{...}
//當ref分配給reactive時,ref將自動解包
const obj = reactive({ a: count }) //不需要count.value
console.log(obj.a) // 1
console.log(obj.a === count.value) // true
//obj.b=7 //添加屬性會報錯 // { a: number; }上不存在屬性b
//const str=reactive("aaa")   //這是報錯的,reactive參數只能是對象
const arr = reactive([1, 2]) //數組,其實結果還是對象
const obj = reactive({ 0: 1, 1: 2 })
console.log('arr', arr) //Proxy {0: 1, 1: 2}
console.log('obj', obj) //Proxy {0: 1, 1: 2}
//reactive定義和ref不同,ref返回的是Ref&lt;T&gt;類型,reactive不存在Reactive&lt;T&gt;
//它返回是UnwrapNestedRefs&lt;T&gt;,和傳入目標類型一致,所以不存在定義通用reactive類型
function reactiveFun&lt;T extends object&gt;(target: T) {
  const state = reactive(target) as UnwrapNestedRefs&lt;T&gt;
  return state
}
type typPeople = {
  name: string
  age: number
}
const item: typPeople = { name: 'aa', age: 18 }
const obj1 = reactive(item) //obj1 類型為: { name: string; age: number; }
const obj2 = reactiveFun(item) //obj2 類型為: { name: string; age: number; }

isRef、isReactive

// isRef 檢查值是否為一個 ref 對象
console.log('是否為ref:', isRef(count)) //true
//isProxy 檢查對象是否是 由reactive或readonly創建的 proxy
//readonly是原始對象的只讀代理
console.log('ref是否為proxy:', isProxy(count)) //false
console.log('reactive是否為proxy:', isProxy(obj)) //true
//isReactive 檢查對象是否是由 reactive 創建的響應式代理
console.log('isReactive判斷:', isReactive(obj)) //true

toRef、toRefs、toRaw

  • toRef 為源響應式對象上的某個元素 新創建一個 ref

  • toRefs 將響應式對象Proxy 轉換為普通對象,且元素都指向原始對象的ref

  • toRaw 返回 reactive或readonly代理的原始對象

toRef 當你要將 prop 的 ref 傳遞給復合函數時,toRef 很有用

const state = reactive({
  foo: 1,
  bar: 2
})
console.log(state.foo) //1
state.foo++
console.log(state.foo) //2
const fooRef = toRef(state, 'foo')
fooRef.value++
console.log(state.foo) //3  但state.foo并沒有.value屬性,不要混淆

toRefs 將響應式對象Proxy轉換為普通對象,且元素都指向原始對象的ref

toRaw 返回 reactive或readonly 代理的原始對象,當然也可以返回ref的原始對象

const state = reactive({
  foo: 1,
  bar: 2
})
console.log(state) //Proxy {foo: 1, bar: 2}
const refs1 = toRefs(state) //toRefs 將響應式對象Proxy 轉換為普通對象
console.log('toRefs:', refs1) //{foo: ObjectRefImpl, bar: ObjectRefImpl}
const refs2 = toRaw(state) //toRaw 返回 reactive或readonly代理的原始對象
console.log('toRaw:', refs2) //{foo: 1, bar: 2}
const ref1 = ref(5) //ref并不是Proxy,而是RefImpl
const refs3 = toRefs(ref1) //不報錯,但沒意義

以上就是“vue3+ts中怎么使用ref與reactive指定類型”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东明县| 改则县| 佛教| 合水县| 泸溪县| 甘谷县| 双柏县| 田东县| 河津市| 徐水县| 宝丰县| 蓬溪县| 哈尔滨市| 巴彦县| 黎平县| 历史| 巴彦淖尔市| 大英县| 广河县| 凉城县| 大安市| 綦江县| 建水县| 荔浦县| 黔江区| 临桂县| 中山市| 上饶县| 杨浦区| 旬邑县| 天全县| 原平市| 白河县| 通河县| 遵义县| 黄冈市| 梅河口市| 慈利县| 拜泉县| 舞阳县| 西和县|