组件通信方式之Props–defineProps的使用
直接上代码ba
父组件代码Father.vue
<script setup>
import { ref } from "vue";
//props:可以实现父子组件通信,props数据还是只读的!!!
import Child from "./ChildM.vue";
let info = "这是父组件传过去的消息info";
let infoNum = ref(100);
function add() {
infoNum.value++;
}
</script>
<template>
<div class="father">
<h1>我是父组件</h1>
<h2>infoNum的值为:{{ infoNum }}</h2>
<Child :info="info" :infoNum="infoNum" :add="add"></Child>
</div>
</template>
<style>
.father {
height: 500px;
background: yellowgreen;
}
</style>
子组件代码Child.vue
<script setup>
import { ref } from "vue";
//需要使用到defineProps方法去接受父组件传递过来的数据
//defineProps是Vue3提供方法,不需要引入直接使用
//接收props有两种写法,数组|对象写法都可以
// let props = defineProps(["info", "infoNum", "add"]);
let props = defineProps({ info: String, infoNum: Number, add: Function });
console.log("props输出啦", props);
// function add() {
// haha.value += 10;
// }
let info = "我是子组件定义的info";
//按钮点击的回调
const updateProps = ()=>{
// props.infoNum +=10; props:只读的
console.log(props.infoNum)
}
</script>
<template>
<div class="son">
<h1>我是子组件</h1>
<!--若子组件中定义了与props变量/函数名相同的变量/函数,则在访问props变量时需要加props前缀,则子组件中定义的变量/函数会覆盖父组件中传递过来的变量/函数-->
<div>{{ props.info }}</div>
<div>{{ info }}</div>
<!--props可以省略前面的名字--->
<div>父组件传递的infoNum:{{ infoNum }}</div>
<!-- 子组件调用父组件中定义的函数,可以修改props数据 -->
<button @click="add()">点击增加infoNum</button>
<button @click="updateProps">修改props数据</button>
</div>
</template>
<style>
.son {
height: 300px;
background: pink;
}
</style>
总结:
1.props:可以实现父子组件通信,
props数据是只读
的;
2.在子组件中想修改父组件数据
,可通过调用父组件props传递过来的函数
的方式;
3.在子组件中需要使用到defineProps
方法去接受父组件传递过来的数据;
4.defineProps有数组|对象
两种写法;
5.在子组件中若未定义与props数据变量/函数名相同的变量/函数,在模板使用时可以省略前缀props.
,否则需要加前缀。
如有错误,欢迎指出,我修正!谢谢!