1. 父传子 defineProps
父组件传值给子组件主要是由父组件通过v-bind
绑定数值,而后传给子组件;子组件则通过defineProps
接收使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <template> <div class="fu"> <p>我是父组件</p> <son :toSomMeg="toSomMeg"></son> </div> </template> <script setup lang="ts"> import { ref } from "vue"; import son from "./son.vue";
const toSomMeg = ref("给子组件的消息"); </script>
<style> .fu { width: 100%; background-color: aquamarine; border: 2px solid #333; } </style>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <template> <div class="zi"> <p>我是子组件</p> <p> 来自父组件的信息: <span style="color: red">{{ toSomMeg }}</span> </p> </div> </template> <script setup lang="ts"> interface Props { toSomMeg?: string; }
const props = defineProps<Props>(); console.log(props.toSomMeg); </script> <style> .zi { width: 100%; background-color: skyblue; border: 1px solid #333; } </style>
|
父组件在调用子组件时使用 v-bind 绑定参数,并传给子组件;
子组件使用 defineProps 接收父组件传递来的参数,然后就能正常使用该参数了。
2. 子传父 defineEmits
子组件传值给父组件主要是通过defineEmits
注册一个自定义事件,而后触发调用自定义事件,并传递参数给父组件。
在父组件中调用子组件时,通过 v-on 绑定一个函数,通过该函数传过来的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <template> <div class="fu"> <p>我是父组件</p> <son :toSomMeg="toSomMeg" @toFaMsg="getSumMsg"></son> <p> 父组件收到子组件的信息:<span style="color: red">{{ sunMeg }}</span> </p> </div> </template> <script setup lang="ts"> import { ref } from "vue"; import son from "./son.vue";
const sunMeg = ref(""); function getSumMsg(val: string) { sunMeg.value = val; } </script>
<style> .fu { width: 100%; background-color: aquamarine; border: 2px solid #333; } </style>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <template> <div class="zi"> <p>我是子组件</p> <p> <el-button type="primary" @click="onClick">点击传给父组件</el-button> </p> </div> </template> <script setup lang="ts"> import { ref } from "vue";
const val = ref<string>("子组件给父组件的信息");
const emit = defineEmits(["toFaMsg"]); function onClick() { emit("toFaMsg", val); } </script>
<style> .zi { width: 100%; background-color: skyblue; border: 1px solid #333; } </style>
|
3. 子组件暴露属性给父组件 defineExpose
当父组件想直接调用子组件的方法时候,子组件可以使用defineExpose
暴露自身的属性或者方法,父组件中使用ref
直接调用子组件暴露的属性或方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <template> <div class="zi"> <p>我是子组件</p> </div> </template> <script setup lang="ts"> import { ref } from "vue";
function Prints(): void { alert("老铁 666"); }
defineExpose({ Prints }); </script>
<style> .zi { width: 100%; background-color: skyblue; border: 1px solid #333; } </style>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <template> <div class="fu"> <p>我是父组件</p> <son ref="sonMethod"></son> <el-button type="primary" @click="getSonMethod">使用子组件的方法</el-button> </div> </template> <script setup lang="ts"> import { ref } from "vue"; import son from "./son.vue";
const sonMethod = ref(); function getSonMethod() { sonMethod.value.Prints(); } </script>
<style> .fu { width: 100%; background-color: aquamarine; border: 2px solid #333; } </style>
|