zoukankan      html  css  js  c++  java
  • vue.js 组件 之 prop 传递数据

    为何需要prop

    在一个父组件包含一个子组件时,父组件和子组件一般来说都需要沟通交流。且通常情况下,是父组件传递数据给特定的子组件,由特定的子组件负责特定的逻辑处理得出特定的值。父组件给子组件传递数据这一过程就是通过为子组件设置prop实现的。使用prop的另一个原因是每个组件的作用域都是相互独立的,即使是父级组件和子级组件的关系。所以就由prop承担起父级组件向子级组件传递数据这一重任。

    prop需要提前声明

    比如我们定义的组件需要通过a属性获得父组件传递的数据就必须像这样先声明

    Vue.component("cpt",{
        template:"<div>{{messageByA}}</div>"
        ,prop:["a"]
    });
    
    <parentComponent>
    <cpt a="a"></cpt>
    </parentComponent>
    

    输出为:

    <parentComponent>
    <div>a</div>
    </parentComponent>

    需要注意的是当我们在props数组中使用骆驼标记法,我们在书写html时必须使用短横线分隔标记法,就像这样

    props:["someProp"]      //someProp骆驼标记法
    <cpt some-prop="someValue"></cpt>       //some-prop短横线分隔标记法

    给prop绑定静态值与动态值

    绑定静态值

    <cpt some-prop="db"></cpt>      //绑定静态值字符串"db"

    绑定动态值

    //#el为一个vue实例且data中设置了db属性
    <div id="el">
    <cpt :some-prop="db"></db>
    </div>

    绑定静态值时常常会认为这样是传递了数字

    <cpt some-prop="5"></cpt>

    其实是传递了字符串“5”,下面这种方式也是传递了字符串“5”

    <cpt some-prop=5></cpt>

    如果我们想传递一个数字5该怎么办呢?

    <cpt :some-prop="5"></cpt>      //传递了数字5

    为什么会这样呢?因为:some-prop是vue的指令,会将字符串里的作为表达式计算得到返回值,因此就为数字5
    还有一种情况值得注意:

    <div id="d"><db s=5></db></div>
    <script>
        let d=new Vue({
            el:"#d"
            ,components:{
                db:{
                    props:["s"]
                    ,template:`<div>${s}</div>`
                    //此处为模板字符串相当于"<div>"+s+"</div>"
                }
            }
        });
    </script>

    结果为页面上显示undefined。这是因为js运行到template那一行时,vue尚未实例化结束,其局部化定义的组件db也没有实例化完成,也就不要说去接收给db组件传递的s属性的值这一操作了,此时,s为undefined。
    正确操作:

    <div id="d"><db s=5></db></div>
    <script>
        let d=new Vue({
            el:"#d"
            ,components:{
                db:{
                    props:["s"]
                    ,template:`<div>{{s}}</div>`
                }
            }
        });
    </script>

    这是操作步骤变为
    1.vue实例和db组件实例化结束。
    2.db组件接收储存字符串“5”作为s的值
    3.<div id="d"><db s=1></db></div>变为<div id="d"><div>{{s}}</div></div>
    4.计算s在db组件中查找s的值
    5.最终结果为<div id="d"><div>5</div></div>

    对prop值进一步操作

    我们有些现对prop值进行进一步操作加工,可以通过computed来实现

    props:["someProp"]
    ,computed:{
        key:function(){
            return someProp+1;//对someProp进行加一操作返回
        }
    }

    注意获取到的prop值如果为object(array也是object的一种),将保有对此对象的引用,对此对象进行更改会造成其他持有此对象的受到影响。

    对传入的prop值进行验证

    话不多说直接上代码

    Vue.component("cpt",{
        template:...
        ,props:{
            p:{
                type:Object//此处为一构造函数,操作为p instanceOf 构造函数
                ,required:true/false//是否必须输入true为必须
                ,defalut:value/function//设置默认值可以为直接值也可以为返回值的函数
            }
        }
    });

    也可以这样写的简单点

    props:{
        p:Object//直接些构造函数名,不要必须输入,输入的话会用instanceOf判断
        ,p1:[Object,Number]//多个构造函数,可以输入多个类型的值
    }

    也可以自定义检测函数

    props:{
        p:{
            validate:fucntion(v){
                return v%2==0;//输入的值必须为偶数
            }
        }
    }
  • 相关阅读:
    jchdl
    jchdl
    UVa 10256 (判断两个凸包相离) The Great Divide
    UVa 11168 (凸包+点到直线距离) Airport
    LA 2572 (求可见圆盘的数量) Kanazawa
    UVa 10652 (简单凸包) Board Wrapping
    UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
    UVa 10674 (求两圆公切线) Tangents
    UVa 11796 Dog Distance
    LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
  • 原文地址:https://www.cnblogs.com/dbdb/p/7695051.html
Copyright © 2011-2022 走看看