有时候我们定义一个组件后,需要让调用者传入参数,那么就可以将参数定义成属性。示例代码如下:
<script setup name="Person">
// Person组件
import {defineProps} from "vue";
// 1. 使用数组的形式
//const props = defineProps(['username'])
// 2. 使用对象的形式
const props = defineProps({
gender: {
type: String,
default: '男'
},
username: String,
age: Number,
body: {
height: Number,
weight: Number
}
})
</script>
<template>
<p>
用户名:{{ props.username }},
年龄:{{ props.age }},
身高:{{ props.body.height }},
体重:{{ props.body.weight }}
</p>
</template>
<script setup>
import Person from "./components/Person.vue"
</script>
<template>
<Person :age="18" username="张三" :body="{height: 180, weight: 140}"></Person>
</template>
子组件不能修改父组件传过来的props
,否则会引起错误。
子组件可以自定义事件,然后父组件可以实现发生这个事件的处理函数。示例代码如下:
<script setup name="Person">
import {defineEmits, ref} from "vue";
let steps = ref(0);
const emit = defineEmits(['change']);
const onUpdate = () => {
steps.value += 10
emit('change', steps.value);
}
</script>
<template>
<button @click="onUpdate">行走10步</button>
</template>
<script setup>
import Person from "./components/Person.vue"
const onPersonChange = (steps) => {
console.log("步行了:", steps);
}
</script>
<template>
<Person @change="onPersonChange"></Person>
</template>
使用v-model
可以定义一个在父组件和子组件中双向绑定的对象。示例代码如下:
<script setup name="Person">
import {defineModel, watch} from "vue";
let steps = defineModel();
const onUpdate = () => {
steps.value += 10;
}
watch(steps, (newValue, oldValue) => {
console.log("Person中监听到steps:", newValue);
})
</script>
<template>
<button @click="onUpdate">行走10步</button>
</template>