vue3的define属性
在父组件中写内容,在子组件用父组件内容的方法:
在子组件里面加上a="123"类似的表达,若在a前面加上:,就要深入计算后面的东西,而非简单停留在表面调用。
let person = Array<PersonInter>[{},{},{}] let person = reactive<Persons>([{},{},{}])
我们来详细解释一下你的问题,这涉及到 Vue 中父组件向子组件传递数据的两种核心方式,以及 Vue 的响应式系统。
你提到的 a="123" 和 :a="123" 是 Vue 中** props 传递数据的两种语法**,它们的核心区别在于 Vue 是否会将等号右边的内容视为“JavaScript 表达式”进行解析。
我们来逐一拆解,并结合你提供的 person 数组例子进行扩充。
1. 静态传递 (a="123")
当你在子组件上这样写时:
<ChildComponent a="123" />
这意味着你正在向子组件的 a 属性传递一个静态的字符串字面量。无论父组件的数据如何变化,子组件收到的 a 的值永远都是字符串 "123"。
- 特点:简单、直接,适用于传递固定不变的值。
- 解析方式:Vue 不会对
"123"进行任何计算,直接将其作为字符串传递。
示例:
// 父组件 Parent.vue
<template>
<div>
<h1>我是父组件</h1>
<ChildComponent a="123" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
}
</script>
// 子组件 ChildComponent.vue
<template>
<div>
<h2>我是子组件</h2>
<p>收到的 a 的值是: {{ a }}</p>
<p>收到的 a 的类型是: {{ typeof a }}</p>
</div>
</template>
<script>
export default {
props: {
a: String // 这里指定 a 的类型为 String
}
}
</script>
子组件输出:
收到的 a 的值是: 123
收到的 a 的类型是: string
2. 动态传递 (:a="123")
当你使用 v-bind 指令(简写为 :)时:
<ChildComponent :a="123" />
这意味着你正在向子组件的 a 属性传递一个JavaScript 表达式的结果。Vue 会解析 123 这个表达式,计算出它的值(在这里是数字 123),然后将这个值传递给子组件。
- 特点:灵活、强大,适用于传递动态变化的数据、变量、计算结果等。
- 解析方式:Vue 会将
123视为一个 JavaScript 表达式并执行它。
示例:
// 父组件 Parent.vue
<template>
<div>
<h1>我是父组件</h1>
<ChildComponent :a="123" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
}
</script>
// 子组件 ChildComponent.vue
<template>
<div>
<h2>我是子组件</h2>
<p>收到的 a 的值是: {{ a }}</p>
<p>收到的 a 的类型是: {{ typeof a }}</p>
</div>
</template>
<script>
export default {
props: {
a: Number // 这里指定 a 的类型为 Number
}
}
</script>
子组件输出:
收到的 a 的值是: 123
收到的 a 的类型是: number
这里的核心区别就是传递的是字符串 "123" 还是数字 123。
结合你的 person 数组进行扩充
现在我们来看看你提到的数组例子,这正是动态传递的典型场景。
假设你有一个用户列表,你想把这个列表传递给子组件去渲染。
场景一:传递一个普通数组 (非响应式)
// 父组件 Parent.vue
<template>
<div>
<h1>用户列表</h1>
<!-- 动态传递 users 数组 -->
<UserList :users="users" />
</div>
</template>
<script>
import UserList from './UserList.vue';
export default {
components: {
UserList
},
data() {
return {
// 这是一个普通的数组
users: [
{ id: 1, name: '张三' },
{ id: 2, name: '李四' },
{ id: 3, name: '王五' }
]
};
}
}
</script>
// 子组件 UserList.vue
<template>
<ul>
<li v-for="user in users" :key="user.id">
{{ user.name }}
</li>
</ul>
</template>
<script>
export default {
// 子组件通过 props 接收
props: {
users: {
type: Array,
required: true
}
}
}
</script>
在这个例子中,:users="users" 告诉 Vue:“请把父组件 data 中 users 这个变量的值,传递给子组件的 users 属性”。
场景二:传递一个响应式数组 (reactive)
在 Vue 3 中,reactive 是创建响应式对象的核心 API。当你将一个数组用 reactive 包裹后,它就变成了响应式的。
// 父组件 Parent.vue
<template>
<div>
<h1>响应式用户列表</h1>
<button @click="addUser">添加新用户</button>
<!-- 同样是动态传递,但传递的是一个响应式对象 -->
<UserList :users="reactiveUsers" />
</div>
</template>
<script>
import { reactive } from 'vue';
import UserList from './UserList.vue';
export default {
components: {
UserList
},
setup() {
// 创建一个响应式的用户数组
const reactiveUsers = reactive([
{ id: 1, name: '张三' },
{ id: 2, name: '李四' },
{ id: 3, name: '王五' }
]);
// 添加新用户的方法
const addUser = () => {
const newId = reactiveUsers.length + 1;
reactiveUsers.push({ id: newId, name: `新用户${newId}` });
};
return {
reactiveUsers,
addUser
};
}
}
</script>
子组件 UserList.vue 的代码完全不需要改变。
为什么这样能工作?
- 父组件通过
:users="reactiveUsers"将响应式数组reactiveUsers传递给子组件。 - 当你点击“添加新用户”按钮时,
addUser方法会调用reactiveUsers.push()。 - 由于
reactiveUsers是响应式的,Vue 会检测到它的变化。 - Vue 会自动通知所有使用了
reactiveUsers的组件(在这里是子组件UserList)进行更新。 - 子组件的
usersprop 会自动获取到最新的数组内容,v-for指令重新渲染列表,新用户就显示出来了。
总结
| 语法 | 名称 | 作用 | 示例 | 传递的内容 |
|---|---|---|---|---|
a="123" |
静态绑定 | 传递字符串字面量 | <Child a="123" /> |
字符串 "123" |
:a="123" |
动态绑定 (v-bind) |
传递 JavaScript 表达式的结果 | <Child :a="123" /> |
数字 123 |
<Child :a="count + 1" /> |
表达式 count + 1 的计算结果 |
|||
<Child :a="users" /> |
变量 users 的值(可以是数组、对象等) |
在实际开发中,动态绑定 (:a="...") 使用得更为频繁,因为它是实现父子组件数据同步和交互的主要方式,也是 Vue 响应式系统发挥作用的关键。
浙公网安备 33010602011771号