ps和dw做網(wǎng)站如何優(yōu)化培訓(xùn)方式
ref標(biāo)簽
作用:用于注冊(cè)模板引用。
用在普通
DOM
標(biāo)簽上,獲取的是DOM
節(jié)點(diǎn)。用在組件標(biāo)簽上,獲取的是組件實(shí)例對(duì)象。
用在普通DOM
標(biāo)簽上:
<template><div class="person"><h1 ref="title1">小C學(xué)安全</h1><h2 ref="title2">前端</h2><h3 ref="title3">Vue</h3><input type="text" ref="inpt"> <br><br><button @click="showLog">點(diǎn)我打印內(nèi)容</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標(biāo)簽上需要設(shè)置id=title1// const t1 = document.getElementById('title1')// 打印內(nèi)容// 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>
用在組件標(biāo)簽上:
在父組件中設(shè)置ref標(biāo)簽,獲取到的是子組件對(duì)象,還沒有獲取到真正數(shù)據(jù)
例如
//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學(xué)安全</h1><h2 ref="title2">前端</h2><h3 ref="title3">Vue</h3><input type="text" ref="inpt"> <br><br><!-- <button @click="showLog">點(diǎn)我打印內(nèi)容</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將組件中的數(shù)據(jù)交給外部,就可以獲取到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學(xué)安全</h1><h2 ref="title2">前端</h2><h3 ref="title3">Vue</h3><input type="text" ref="inpt"> <br><br><!-- <button @click="showLog">點(diǎn)我打印內(nèi)容</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>
除了使用字符串?dāng)?shù)組來聲明 props 外,還可以使用對(duì)象的形式:
// 使用 <script setup>
defineProps({title: String,likes: Number
})
如果你正在搭配 TypeScript 使用
<script setup lang="ts">
defineProps<{title?: stringlikes?: number
}>()</script>
傳遞不同的值類型
在上述的兩個(gè)例子中,我們只傳入了字符串值,但實(shí)際上任何類型的值都可以作為 props 的值被傳遞。
Number?
<!-- 雖然 `42` 是個(gè)常量,我們還是需要使用 v-bind -->
<!-- 因?yàn)檫@是一個(gè) JavaScript 表達(dá)式而不是一個(gè)字符串 -->
<BlogPost :likes="42" /><!-- 根據(jù)一個(gè)變量的值動(dòng)態(tài)傳入 -->
<BlogPost :likes="post.likes" />
Boolean?
<!-- 僅寫上 prop 但不傳值,會(huì)隱式轉(zhuǎn)換為 `true` -->
<BlogPost is-published /><!-- 雖然 `false` 是靜態(tài)的值,我們還是需要使用 v-bind -->
<!-- 因?yàn)檫@是一個(gè) JavaScript 表達(dá)式而不是一個(gè)字符串 -->
<BlogPost :is-published="false" /><!-- 根據(jù)一個(gè)變量的值動(dòng)態(tài)傳入 -->
<BlogPost :is-published="post.isPublished" />
Array?
<!-- 雖然這個(gè)數(shù)組是個(gè)常量,我們還是需要使用 v-bind -->
<!-- 因?yàn)檫@是一個(gè) JavaScript 表達(dá)式而不是一個(gè)字符串 -->
<BlogPost :comment-ids="[234, 266, 273]" /><!-- 根據(jù)一個(gè)變量的值動(dòng)態(tài)傳入 -->
<BlogPost :comment-ids="post.commentIds" />
Object?
<!-- 雖然這個(gè)對(duì)象字面量是個(gè)常量,我們還是需要使用 v-bind -->
<!-- 因?yàn)檫@是一個(gè) JavaScript 表達(dá)式而不是一個(gè)字符串 -->
<BlogPost:author="{name: 'Veronica',company: 'Veridian Dynamics'}"/><!-- 根據(jù)一個(gè)變量的值動(dòng)態(tài)傳入 -->
<BlogPost :author="post.author" />
代碼演示:
指定固定數(shù)據(jù)類型
// 定義一個(gè)接口,限制每個(gè)Person對(duì)象的格式
export interface PersonInter {
id:string,
name:string,age:number
}// 定義一個(gè)自定義類型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}>()// 第三種寫法:接收+限制類型+指定默認(rèn)值+限制必要性
let props = withDefaults(defineProps<{list?:Persons}>(),{list:()=>[{id:'asdasg01',name:'小豬佩奇',age:18}]
})
console.log(props)
</script>