vue教程二 vue组件(3)

给属性传递数据

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <title></title>
        <style type="text/css">
            
        </style>
    </head>
    <body>
        <div id="app">
            <!-- 外部传入属性值 -->
            <my-button color="red"></my-button>
        </div>
        <script>
            //全局定义组件
            Vue.component('my-button',{
                template:'<button v-bind:style="style">this is my button</button>',
                props:['color'], //设置组件属性color
                computed: {
                    style(){
                        return {backgroundColor:this.color}; //内部使用属性color
                    }
                }
            });
            
            var app = new Vue({
                el: '#app',
                data: {
                    
                }
                
            });
        </script>
    </body>
</html>

还可以定义组件属性的类型,默认值,是否必须,添加属性验证函数

您已经看到,当数据对象、方法或计算属性的值发生更改时,也会更新模板,这对props也适用。当设置组件上的props将其绑定到一个值时,可以使用vbind,然后当该值发生更改时,组件中使用它的任何地方也会更新

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <title></title>
        <style type="text/css">
            
        </style>
    </head>
    <body>
        <div id="app">

            <!-- 外部传入属性值 -->
            <my-button my-alt="1111" color="red" text="1212" v-bind:price="price"></my-button>
            
            <p>{{price}}</p>
        </div>
        <script>
            //全局定义组件
            Vue.component('my-button',{
                template:'<div v-bind:alt="myAlt"><button v-bind:style="style">{{text}} </button> <span>{{price}}</span></div>',
                props:{
                    color:{
                        type:String,
                        default    :"blue",
                        required:false,
                    },
                    text:[String,Number] ,//如果一个属性是多种类型中的一种,那么您可以传入数组中的所有有效类型
                    price:{
                        type:Number,
                        default:0.00,
                        required:true,
                        validator(val){ //验证属性price必须大于等于0
                            return val>=0
                        }
                    },
                    myAlt:String,  //注意vue会帮我们自动转换驼峰命名为"-"方式,在元素上使用的属性应该为:my-alt
                },
                computed: {
                    style(){
                        return {backgroundColor:this.color}; //内部使用属性color
                    }
                },
            });
            
            var app = new Vue({
                el: '#app',
                data: {
                    price:0,
                },
                created() {
                    let that=this;
                    setInterval(function(){
                        that.price++;
                    },1000);
                }
                
            });
        </script>
    </body>
</html>

 

数据通过一个props从父对象传递给子对象,当该数据在父对象中被更新时,传递给子对象的道具也被更新。但是,您不能从子组件修改该props。这就是所谓的单向绑定,它可以防止组件可能无意中改变父组件的状态

 

所有 props 都在子组件和父组件之间形成一个单向往下流动的数据绑定:当父组件中的属性更新时,数据就会向下流动到子组件,但是反过来,子组件属性更新时,父组件并不会感知到子组件的数据变化。这种机制可以防止子组件意外地修改了父组件的状态,造成应用程序的数据流动变得难于理解。

 

此外,每次父组件更新时,子组件中所有的 props 都会更新为最新值。也就是说,你不应该试图在子组件内部修改 prop。如果你这么做,Vue 就会在控制台给出警告。

 

 

【前端全套视频教程】https://weihaibao.taobao.com/m/QWYr3w57z  点击链接,跟多教程请浏览本店(价格便宜公道,买不了吃亏买不了上当)

posted @ 2019-07-31 16:43  tomcuper  阅读(238)  评论(0编辑  收藏  举报