Vue3魔法手册 作者 张天禹 09_props的使用

025_props的使用

绿色包裹的一推人他不是响应式
personsList定义为响应式数据
推荐用如下方式定义响应式数据 调用函数时传泛型
每一项必须为 PersonInter 类型,否则报错(多一个x立马报错)
比第4个一定要添加性别 sex,其他不要,该如何处理,去src/types/index.ts添加如下代码
复制代码
export interface PersonInter {
	id : string,
	name : string,
	age : number,
	sex? : string
}

解释:添加 sex? : string 这一行代码
? 表示在使用的地方可有可无
父组件数据定义好了,如何将数据传给子组件?
你给子组件Person 传了一个a,值为 '哈哈',子组件就要接收'哈哈'
子组件如何接收:引入 defineProps 然后调用该方法,要求传一数组,数组里面必须为一个一个的字符串,字符串写什么,不可以自由发挥,父组件传什么字符串,子组件接收就写什么字符串。
红色框里面的数据就是子组件接收到父组件的数据
下面就可以使用了,可以去子组件模板展示该数据,收什么就写什么
效果如下
我们不看脚本,你没法说a是什么,a可能是ref定义的数据,a也有可能是reactive定义的数据,还有可能是computed定义的计算属性, a 还有可能是props数据等.
不能打印a,红色的a是数组包了一层,粉色的a是当成变量打印的,粉色的a去找变量,没有所以报错
对象包含你所有接收的数据
代码-效果
自己的 代码-效果
代码-效果 老师的
本义传的是绿色的部分,而并非personList
所以我们需要在list前加一冒号
:list前加冒号,personList就开始读变量了,如下所示
你没有系统学习过vue2,可能会对添加冒号有点迷惑
字符串
表达式 可以运算
d去下面读值,这里使用setup语法糖,能返回数据,d 就可以读到数据9
ref标签
下面代码遍历时必须加 :key="item.id",冒号表示去读取每一项的id,此处必须加id唯一标识,否则遍历时他会产生一个严重问题,他会以遍历的索引值作为key值,你数据更新的时候,容易错乱。且不能 key="item.id"这样写, 此时表示每一项的id都为 item.id, 所以不能少key前面的冒号.后端给过来的值,有唯一标识id,就必须使用 :key="item.id" 如果没有唯一标识id,此时我们就可以使用 index
复制代码
<ul>
    <li v-for="item in list" :key="item.id">
        {{ item.name }}--{{ item.age }}
    </li>
</ul>
list 不仅可以写数据还可以写具体的遍历次数,传的是次数,接收的也是次数,遍历的时候也是次数
父组件给什么子组件就用什么
子组件只要一限制接收类型,父组件的list="5"立马就报错了
子组件不限制,list="5" 是不会报错的,但是页面展示就比较奇怪了
提示: 我期待一个数组,但是得到一个number=5
告诉父组件,我必须接收一个list
? 表示父组件可传也可不传 不传->子组件展示一个默认值
如何展示子组件默认值
复制代码
1, 首先 引入 withDefaults
import {withDefauts} from 'vue'
不能直接写数组, 所以list 飘红,必须要返回一个值,所以就写函数
list得是一个函数,返回一个对象,写成函数,立刻就好了
最终极的写法
withDefaults:配置默认值
defineProps: 接收
list :控制标识
Persons: 限制类型
子组件生声明 list? 这可传也可不传
但你必须是 Persons 类型
自己的 代码-效果

define-开头的函数是宏函数,一般是不需要引入的,可以直接使用

_props的使用 实现代码如下
复制代码
1, src/components/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 setup lang="ts" name="Person">
	import {defineProps, withDefaults } from 'vue';
	import {type Persons} from '@/types'

	// 接收list
	// defineProps(['list'])

	// 接收list + 限制类型  校验
	// defineProps<{list:Persons}>()

	// 接收list + 限制类型 + 限制必要性 + 指定默认值
	withDefaults(defineProps<{list?:Persons}>(),{
		list: () => [
			{id:'zg01',name:'康师傅',age:18},
			{id:'zg02',name:'龙辛拉面',age:20}
		]
	})

	// 接收list同时将props保存起来
	// let props = defineProps(['list'])	

	// 接收a,b同时将props保存起来
	// let props = defineProps(['a','b'])
	// console.log(props.a);
	// console.log(props.b);
</script>

<style scoped>
	.person {
		background-color: skyblue;
		box-shadow: 0 0 10px;
		border-radius: 10px;
		padding: 20px;
	}

	button {
		margin: 0 5px;
	}

	li {
		font-size: 20px;
	}
</style>




2, src/App.vue
<template>
  <!-- 务必看懂下面这行代码 -->
  <!-- <h2 a="1+1" :b="1+1" c="x" :d="x" ref="qwe">测试</h2> -->
  <Person a="哈哈" />
</template>

<script setup lang="ts" name="App">
  import Person from '@/components/Person.vue';
  import {reactive} from 'vue'
  import {type Persons} from '@/types/index'

  let x = 10;

  let personList = reactive<Persons>([
    {id: 'axs01', name: '张三',age: 23},
    {id: 'axs02', name: '李四',age: 24},
    {id: 'axs03', name: '王五',age: 25},
    {id: 'axs04', name: '赵六',age: 26}
  ])

  // console.log(personList);
</script>

<style scoped>
  .app {
    background-color: #ddd;
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
  }
</style>




3, src/types/index.ts
// 定义一个接口,用于限制person对象的具体属性和类型
// PersonInter是自定义接口,限制一个人的,id,name,age三个属性,分别是字符串和数字类型
export interface PersonInter {
	id : string,
	name : string,
	age : number,
	sex? : string
}

// 一个自定义类型,用于限制person对象的具体属性和类型
// Persons是自定义类型,限制一堆人的
// 第一种写法 泛型
// export type Persons = Array<PersonInter>

// 第二种写法 自定义类型
export type Persons = PersonInter[]




4, src/main.ts
// 引入 createApp 用于创建应用
import {createApp} from 'vue'
// 引入 App根组件
import App from './App.vue'
// 调用createApp()方法创建应用并放在id为app的容器里面
createApp(App).mount('#app')




5, index.html
<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vite App</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>
相关推荐
哆啦A梦15882 小时前
Vue3魔法手册 作者 张天禹 11_自定义hooks
前端·vue.js·typescript
广州华水科技2 小时前
单北斗变形监测在大坝安全和地质灾害预警中的应用与优势
前端
一叶星殇2 小时前
Windows 下用 Nginx 部署 Vue + .NET WebApi 全流程实战
vue.js·windows·nginx
阿珊和她的猫2 小时前
深入理解 Vue 3 的 `setup` 函数
前端·vue.js·状态模式
weixin199701080162 小时前
微店商品详情页前端性能优化实战
前端·性能优化
feasibility.2 小时前
打造AI+准SaaS:中文法律检索分析平台
vue.js·人工智能·自然语言处理·django·sass·web·法律
星火开发设计2 小时前
STL 容器:vector 动态数组的全面解析
java·开发语言·前端·c++·知识
天開神秀2 小时前
解决 n8n 在 Windows 上安装社区节点时 `spawn npm ENOENT/EINVAL` 错误
前端·windows·npm
工业HMI实战笔记2 小时前
图标标准化:一套可复用的工业图标库设计指南
前端·ui·性能优化·自动化·汽车·交互