【VUE基础】VUE3第三节—核心语法之ref标签、props

ref标签

作用:用于注册模板引用。

  • 用在普通DOM标签上,获取的是DOM节点。

  • 用在组件标签上,获取的是组件实例对象。

用在普通DOM标签上:

typescript 复制代码
<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标签,获取到的是子组件对象,还没有获取到真正数据

例如

typescript 复制代码
//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值

例如:

typescript 复制代码
//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

在使用

typescript 复制代码
<script setup>
const props = defineProps(['foo'])

console.log(props.foo)
</script>

除了使用字符串数组来声明 props 外,还可以使用对象的形式:

typescript 复制代码
// 使用 <script setup>
defineProps({
  title: String,
  likes: Number
})

如果你正在搭配 TypeScript 使用

typescript 复制代码
<script setup lang="ts">
defineProps<{
  title?: string
  likes?: number
}>()

</script>

传递不同的值类型

在上述的两个例子中,我们只传入了字符串值,但实际上任何类型的值都可以作为 props 的值被传递。

Number​

typescript 复制代码
<!-- 虽然 `42` 是个常量,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost :likes="42" />

<!-- 根据一个变量的值动态传入 -->
<BlogPost :likes="post.likes" />

Boolean​

typescript 复制代码
<!-- 仅写上 prop 但不传值,会隐式转换为 `true` -->
<BlogPost is-published />

<!-- 虽然 `false` 是静态的值,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost :is-published="false" />

<!-- 根据一个变量的值动态传入 -->
<BlogPost :is-published="post.isPublished" />

Array​

typescript 复制代码
<!-- 虽然这个数组是个常量,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost :comment-ids="[234, 266, 273]" />

<!-- 根据一个变量的值动态传入 -->
<BlogPost :comment-ids="post.commentIds" />

Object​

typescript 复制代码
<!-- 虽然这个对象字面量是个常量,我们还是需要使用 v-bind -->
<!-- 因为这是一个 JavaScript 表达式而不是一个字符串 -->
<BlogPost
  :author="{
    name: 'Veronica',
    company: 'Veridian Dynamics'
  }"
 />

<!-- 根据一个变量的值动态传入 -->
<BlogPost :author="post.author" />

代码演示:

指定固定数据类型

typescript 复制代码
// 定义一个接口,限制每个Person对象的格式
export interface PersonInter {
id:string,
name:string,
 age:number
}

// 定义一个自定义类型Persons
export type Persons = Array<PersonInter>

App.vue中代码:

typescript 复制代码
<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中代码:

typescript 复制代码
<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>
相关推荐
之歆8 分钟前
Promise 基础技术深度解析:从回调地狱到链式调用
前端·okhttp·promise
甲维斯10 分钟前
国产版“Codex”初体验,智谱ZCode很强啊!
前端·人工智能·ai编程
道友可好12 分钟前
AI 怎么自己跑完一个 6 小时的任务?
前端·人工智能·后端
To_OC25 分钟前
通义千问多模态生图踩坑记:我是如何把两个报错逐个干翻的
前端·aigc·vite
Bigfish_coding29 分钟前
前端转agent-第一周【python】-02 FastAPI与Pydantic实战(TS/JS视角)
前端
秃头网友小李30 分钟前
前端难点:Vue3 响应式遇上 Three.js / ECharts —— 为什么要用 shallowRef?
前端·vue.js
梦曦i31 分钟前
Vite插件开发框架:14个实用插件与完整工具包
前端
KaMeidebaby32 分钟前
卡梅德生物技术快报|biotin 生物素标记抗体全流程
前端·人工智能·算法·数据挖掘·数据分析
VitoChang33 分钟前
前端也能快速入门后端! NestJS前台和后台的Auth认证
前端·后端
TheITSea34 分钟前
一、React初体验:搭建、解析现代开发环境
前端·react.js·前端框架