vue之prpos

<!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">

<title>prop</title>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

</head>

<body>

<div id='app'>

<blog-post title="hello!" :likes='5' isPublished="true" commentIds="[1,2,3]" author="{name:'jim',age:25}"></blog-post>

</div>

<script>

Vue.component("blog-post",{

props:{

title:String,

likes:Number,

isPublished:Boolean,

commentIds:Array,

author:Object

},

template:'<h3>{{title}} {{likes}}</h3>'

})

 

var app = new Vue({

el:"#app",

data:{

 

}

})

</script>

</body>

</html>

 

需要注意的几点:

1、HTML特性不区分大小写。当使用非字符串模板时,props的名字形式会从camelCase转为kebab-case(短横线隔开)

例如:

props:["myMessage"]

<child my-message="hello!"></child>/

2、props验证失败后,控制台会报错

3、传入数字只能通过v-bind进行绑定

4、将父组件的数据传入到子组件中,子组件中进行渲染

 

单向数据流:

<div id='app'>

<blog-post :initial-counter="5"></blog-post>

</div>

<script>

Vue.component("blog-post",{

props:{

initialCounter:Number

},

data:function () {

return{

counter:this.initialCounter

}

},

template:'<h3>{{counter}}</h3>'

})

 

var app = new Vue({

el:"#app",

data:{

 

}

})

</script>

1、子组件将值进行保存后(作为一个本地的props数据)在自己组件上进行渲染

 

注意:如果 :initial-counter=" ABC "是在字符串等加冒号,意味着是在data里面找寻数据进行替换

<div id='app'>

<blog-post size=" ABC "></blog-post>

</div>

<script>

Vue.component("blog-post",{

props:['size'],

computed:{

normallizedSize:function(){

return this.size.trim().toLowerCase()

}

},

template:'<h3>{{normallizedSize}}</h3>'

})

 

var app = new Vue({

el:"#app",

data:{

 

}

})

</script>

2、 原始数据进行转换传入

 

props验证:

<div id='app'>

<blog-post size=" ABC "></blog-post>

</div>

<script>

Vue.component("blog-post",{

props:{

'size':Boolean

},

computed:{

normallizedSize:function(){

return this.size.trim().toLowerCase()

}

},

template:'<h3>{{normallizedSize}}</h3>'

})

 

var app = new Vue({

el:"#app",

data:{

 

}

})

</script>

传入的不是自己的指定类型会报错:

props:{

'size':{

type:[String,Number],

required:true

}

},

字段类型,是否为必须要传的类型

<div id='app'>

<blog-post></blog-post>

</div>

<script>

Vue.component("blog-post",{

props:{

'size':{

type:[String,Number],

default:'20'

}

},

default:function () {

return '20'

}

默认值20

注意:default不能使用computed、data等里面的数据,以为这些是在他渲染后才会有的数据

 

type类型:String,Number,Boolean,Array,Object,Date,Function,Symbol

除此之外,type还支持自定义的构造函数进行校验

 

禁用特性继承:

<div id='app'>

<base-input class='h1' label='hello' value='jim' placeholder="填写用户名称"></base-input>

</div>

<script>

Vue.component('base-input',{

inheritAttrs:false,

props:['label','value'],

template:`

<label>

{{label}}

<input

v-bind="$attrs"

v-bind:value="value"

v-on:input="$emit('input',$event.target.value)"

>

</label>

`

})

var app = new Vue({

el:"#app",

data:{

 

}

})

</script>

inheriAttrs:false和$attrs,可以手动决定这些特性会被赋予哪个元素

 

并且这个模式允许在使用基础组件的同时使用HTML的元素,而不会担心哪个是真正的元素(父组件会传递给子组件)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值