【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>
相关推荐
2401_8315017315 小时前
Web网页之前端三剑客汇总篇(基础版)
前端
木易 士心16 小时前
Vue 3 Props 响应式深度解析:从原理到最佳实践
前端·javascript·vue.js
海鸥两三19 小时前
uniapp 小程序引入 uview plus 框架,获得精美的UI框架
前端·vue.js·ui·小程序·uni-app
lightgis20 小时前
16openlayers加载COG(云优化Geotiff)
前端·javascript·html·html5
小飞大王66621 小时前
TypeScript核心类型系统完全指南
前端·javascript·typescript
你的人类朋友1 天前
✍️记录自己的git分支管理实践
前端·git·后端
合作小小程序员小小店1 天前
web网页开发,在线考勤管理系统,基于Idea,html,css,vue,java,springboot,mysql
java·前端·vue.js·后端·intellij-idea·springboot
防火墙在线1 天前
前后端通信加解密(Web Crypto API )
前端·vue.js·网络协议·node.js·express
Jacky-0081 天前
Node + vite + React 创建项目
前端·react.js·前端框架
CoderYanger1 天前
前端基础——CSS练习项目:百度热榜实现
开发语言·前端·css·百度·html·1024程序员节