彻底弄懂父组件给子组件传值prop

本文详细探讨了如何在Vue中通过props属性从父组件向子组件传递数据,包括默认的字符串传递方式以及使用v-bind实现更精确的数据类型传递。同时,提到了可以通过设置ID、class、style等内置属性来传递信息,Vue会自动处理属性合并和覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

父组件给子组件传值(投票)

局部组件实践和组件之间的嵌套:

父组件把信息传递给子组件:props属性传递

  • 默认传递给子组件的属性值都是字符串格式的,如果需要传递数据的格式是数据本身应该具备的数据,我们需要基于v-bind实现传递(哪怕传递的属性值还是固定)
  • 可以把子组件当做一个标签,我们可以设置ID、clsaa, style等内置属性值,这些属性也会传递给子组件,vue会帮我们处理好的,该合并的合并,该覆盖的覆盖,无需我们在props中注册处理`
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.min.css">
    <title>Document</title>
    <style>
        .container {
            box-sizing: border-box;
            margin: 20px auto;
            padding: 0 10px;
            border: 1px solid #AAA;
            width: 300px;
        }

        .container h3 {
            font-size: 16px;
            line-height: 40px;
            border-bottom: 1px dashed #AAA;
            font-weight: bold;
        }
        .red {
            color: red !important;
        }
    </style>
</head>

<body>
    <!-- 局部组件实践和组件之间的嵌套:
         父组件把信息传递给子组件:props属性传递
         - 默认传递给子组件的属性值都是字符串格式的,如果需要传递数据的格式是数据本身应该具备的数据,我们需要基于v-bind实现传递(哪怕传递的属性值还是固定)
         - 可以把子组件当做一个标签,我们可以设置ID、clsaa, style等内置属性值,这些属性也会传递给子组件,vue会帮我们处理好的,该合并的合并,该覆盖的覆盖,无需我们在props中注册处理
     -->
    <div id="app">
        <my-vote title="今天你吃饭了吗?" :aaa="20" class="red" style="font-size:18px"></my-vote>
        <my-vote title="你见过李子柒吗?"></my-vote>
        <my-vote></my-vote>
    </div>

    <template id="MyVoteTemplate">
        <div class="container">
            <h3><span v-text='title'> </span>(<span>0</span>)</h3>
            <!-- {{DataIndex}} -->
            <vote-content></vote-content>
            <vote-button></vote-button>
        </div>
    </template>

    <template id="VoteContentTemplate">
        <div class="content">
            <p>支持人数:<span>0</span> </p>
            <p>反对人数:<span>0</span> </p>
            <p>支持率:<span>0%</span> </p>
        </div>
    </template>

    <template id="VoteButtonTemplate">
        <div class="footer">
            <button type="button" class="btn btn-primary">支持</button>
            <button type="button" class="btn btn-danger">反对</button>
        </div>
    </template>

    <script src="../node_modules/vue/dist/vue.min.js"></script>
    <script>
        //=>注册组件
        //=>在组件中调取渲染使用
        const VoteContent = {
            template: '#VoteContentTemplate',
            data() {
                return {

                }
            }
        };
        const VoteButton = {
            template: '#VoteButtonTemplate',
            data() {
                return {

                }
            }
        };
        const MyVote = {
            template: '#MyVoteTemplate',
            //=>子组件设置props用来接收父组件基于属性传递进来的信息: 在props中注册的属性和data一样,会挂载在当前实例上 this.title/{{title}}
            //1.父组件传递的属性名是kebab-cese格式,子组件在注册时候应该按照camelCase/PasalCase格式来接收和使用:属性名传递的是大写的,其实也是按照小写的来传递,所以props中注册和使用的时候都按照小写的来处理即可
            //props :["title","aaa"],
            //2.注册属性的校验
            // props :{
            //   title:String,
            //   aaa:[Number,Array]
            // },
            props: {
                title: {
                    type: String,
                    //设置默认值,当 <my-vote></my-vote>中为空,设置默认default数据
                    default: '我是设定的属性默认值',
                },
                aaa: {
                    //=>数据格式
                    type: [Number, Array],
                    //=>是否为必传,TRUE必须传递
                    //required:true
                    //=>自定义验证规则  val传递的属性值,在函数中,根据自己的规则,返回true和false来验证传递的值是否符合规则
                    validator(val) {
                        return val >= 0;
                    }
                }
            },
            data() {
                return {}
            },
            components: {
                VoteContent,
                VoteButton
            },
            created() {
                console.log(typeof this.aaa);
            }
        };
        let vm = new Vue({
            el: '#app',
            components: {
                MyVote
            }
        })
    </script>
</body>

</html>

运行结果如下:
在这里插入图片描述

### React 父组件子组件 在 React 中,父组件可以通过 `props` 将数据递给子组件。这种机制非常简单直观,只需在渲染子组件时将所需的数据作为属性递即可[^1]。 以下是具体实现的一个示例: ```jsx function ParentComponent() { const message = "这是来自父组件的消息"; return ( <ChildComponent data={message} /> ); } function ChildComponent(props) { return ( <div> {props.data} </div> ); } ``` 上述代码展示了父组件通过 `data` 属性将消息递给了子组件,而子组件则通过 `props` 接收并显示该消息[^2]。 --- ### Vue 父组件子组件Vue 中,父组件可以利用 `v-bind` 或者简写形式 `:` 来绑定一个 prop,并将其递至子组件子组件需使用 `props` 选项来声明其预期接收到的 prop [^4]。 下面是一个简单的例子展示这一过程: ```html <template> <ParentComponent/> </template> <script> import ParentComponent from './components/ParentComponent.vue'; export default { components: { ParentComponent } }; </script> ``` ```javascript // ParentComponent.vue <template> <ChildComponent :todo="todo"/> </template> <script> import ChildComponent from './components/ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { todo: '完成今天的任务' }; } }; </script> ``` ```javascript // ChildComponent.vue <template> <p>{{ todo }}</p> </template> <script> export default { props: ['todo'] }; </script> ``` 在此案例中,父组件通过 `:todo="todo"` 把自身的 `todo` 数据项递到了子组件里,随后子组件借助 `props` 定义了自己要接收的内容[^3]。 --- ### 总结对比 无论是 React 还是 Vue,在处理子组件通讯方面都提供了清晰易懂的方式来进行数据流动。React 使用的是基于 JavaScript 对象的形式直接把数据当作属性赋子组件;而在 Vue 当中,则采用了一种更接近 HTML 自然语义化的语法糖——即冒号前缀绑定动态属性的方式来达成相同目的[^4]。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值