ref標簽
作用:用于注冊模板引用。
用在普通
DOM
標簽上,獲取的是DOM
節點。用在組件標簽上,獲取的是組件實例對象。
用在普通DOM
標簽上:
<template><div class="person"><h1 ref="title1">小C學安全</h1><h2 ref="title2">前端</h2><h3 ref="title3">Vue</h3><input type="text" ref="inpt"> <br><br><button @click="showLog">點我打印內容</button></div>
</template><script lang="ts" setup name="Person">import {ref} from 'vue'let title1 = ref()let title2 = ref()let title3 = ref()function showLog(){// 通過id獲取元素 在dom標簽上需要設置id=title1// const t1 = document.getElementById('title1')// 打印內容// console.log((t1 as HTMLElement).innerText)// console.log((<HTMLElement>t1).innerText)// console.log(t1?.innerText)/************************************/// 通過ref獲取元素console.log(title1.value)console.log(title2.value)console.log(title3.value)}
</script>
用在組件標簽上:
在父組件中設置ref標簽,獲取到的是子組件對象,還沒有獲取到真正數據
例如
//APP.vue
<template><Person ref="xiaoc123"/><button @click="test">測試</button>
</template><script lang="ts" setup>import Person from './components/Person.vue'import {ref} from 'vue'let xiaoc123 = ref()function test(){console.log(xiaoc123.value);}
</script>
//Person.vue
<template><div class="person"><h1 ref="title1">小C學安全</h1><h2 ref="title2">前端</h2><h3 ref="title3">Vue</h3><input type="text" ref="inpt"> <br><br><!-- <button @click="showLog">點我打印內容</button> --></div>
</template><script lang="ts" setup name="Person">
import { ref } from 'vue'let name = ref('xiaoc')
let age = ref(20)
</script>
以上代碼并沒有獲取到Person.vue中具體的name,age值
需要使用defineExpose將組件中的數據交給外部,就可以獲取到name,age值
例如:
//APP.vue
<template><Person ref="xiaoc123"/><button @click="test">測試</button>
</template><script lang="ts" setup>import Person from './components/Person.vue'import {ref} from 'vue'let xiaoc123 = ref()function test(){console.log(xiaoc123.value);}
</script>
//Person.vue
<template><div class="person"><h1 ref="title1">小C學安全</h1><h2 ref="title2">前端</h2><h3 ref="title3">Vue</h3><input type="text" ref="inpt"> <br><br><!-- <button @click="showLog">點我打印內容</button> --></div>
</template><script lang="ts" setup name="Person">
import { ref,defineExpose } from 'vue'let name = ref('xiaoc')
let age = ref(20)defineExpose({name,age})
Props
在使用
<script setup>
const props = defineProps(['foo'])console.log(props.foo)
</script>
除了使用字符串數組來聲明 props 外,還可以使用對象的形式:
// 使用 <script setup>
defineProps({title: String,likes: Number
})
如果你正在搭配 TypeScript 使用
<script setup lang="ts">
defineProps<{title?: stringlikes?: number
}>()</script>
傳遞不同的值類型
在上述的兩個例子中,我們只傳入了字符串值,但實際上任何類型的值都可以作為 props 的值被傳遞。
Number?
<!-- 雖然 `42` 是個常量,我們還是需要使用 v-bind -->
<!-- 因為這是一個 JavaScript 表達式而不是一個字符串 -->
<BlogPost :likes="42" /><!-- 根據一個變量的值動態傳入 -->
<BlogPost :likes="post.likes" />
Boolean?
<!-- 僅寫上 prop 但不傳值,會隱式轉換為 `true` -->
<BlogPost is-published /><!-- 雖然 `false` 是靜態的值,我們還是需要使用 v-bind -->
<!-- 因為這是一個 JavaScript 表達式而不是一個字符串 -->
<BlogPost :is-published="false" /><!-- 根據一個變量的值動態傳入 -->
<BlogPost :is-published="post.isPublished" />
Array?
<!-- 雖然這個數組是個常量,我們還是需要使用 v-bind -->
<!-- 因為這是一個 JavaScript 表達式而不是一個字符串 -->
<BlogPost :comment-ids="[234, 266, 273]" /><!-- 根據一個變量的值動態傳入 -->
<BlogPost :comment-ids="post.commentIds" />
Object?
<!-- 雖然這個對象字面量是個常量,我們還是需要使用 v-bind -->
<!-- 因為這是一個 JavaScript 表達式而不是一個字符串 -->
<BlogPost:author="{name: 'Veronica',company: 'Veridian Dynamics'}"/><!-- 根據一個變量的值動態傳入 -->
<BlogPost :author="post.author" />
代碼演示:
指定固定數據類型
// 定義一個接口,限制每個Person對象的格式
export interface PersonInter {
id:string,
name:string,age:number
}// 定義一個自定義類型Persons
export type Persons = Array<PersonInter>
App.vue
中代碼:
<template><Person :list="persons"/>
</template><script lang="ts" setup name="App">
import Person from './components/Person.vue'
import {reactive} from 'vue'import {type Persons} from './types'let persons = reactive<Persons>([{id:'e98219e12',name:'張三',age:18},{id:'e98219e13',name:'李四',age:19},{id:'e98219e14',name:'王五',age:20}])
</script>
Person.vue
中代碼:
<template>
<div class="person">
<ul><li v-for="item in list" :key="item.id">{{item.name}}--{{item.age}}</li></ul>
</div>
</template><script lang="ts" setup name="Person">
import {defineProps} from 'vue'
import {type PersonInter} from '@/types'// 第一種寫法:僅接收
// const props = defineProps(['list'])// 第二種寫法:接收+限制類型
// defineProps<{list:Persons}>()// 第三種寫法:接收+限制類型+指定默認值+限制必要性
let props = withDefaults(defineProps<{list?:Persons}>(),{list:()=>[{id:'asdasg01',name:'小豬佩奇',age:18}]
})
console.log(props)
</script>