上文中写了一个input组件,该组件需要复用,但是并不是每个组件都相同的
比如我定义了一个组件,是个矿泉水瓶子,这个瓶子分为大中小三个号,定义了三种瓶子的容积,定义了必须有瓶盖,瓶口,瓶子质地
但是瓶子的标签,瓶子的细节形状不同
因此瓶子不同的矿泉水生产商的550ml瓶子容积相同,瓶口相同,而品牌辨识度不同的原因
即,矿泉水瓶本身是一个接口,有基础定义
即,不同厂商的矿泉水瓶是该接口的实现,有具体实现定义
因此我对于上文中提到的input组件,定义了基础的style,定义了keyup事件,但是父组件在使用此组件的时候,可能有细节设置的不同
比如标题不同,说明不同,id不同等等
所以,子组件定义了接口,父组件使用,这里就会产生一些问题
1.组件之间的值得传递
子组件获取自身的接口默认定义
父组件为子组件静态定义值
父组件为子组件动态定义值
父组件获取子组件的接口值
父组件对子组件的接口值得修改
如何定义子组件的属性,如id,value,placeholder,type
如何定义子组件的自定义属性,如自定义个labelText
如何定义子组件的class
如何定义子组件的style
这里就是使用了子组件在定义的时候使用的props的相关功能
具体介绍查询官网吧
2.具体代码如下
2.1.input组件的定义(子组件)
1 <template> 2 <div class='div-input-out'> 3 <label>{{labelText}}</label> 4 <input class='div-input' type='text' :placeholder=pl :class='clazz' :style="{fontSize:fontSize+'px'}" v-model:value="value" 5 v-on:keyup='keyups'> 6 </div> 7 </template> 8 9 <script> 10 /* eslint-disable */ 11 // eslint-disable-next-line 12 export default { 13 props: //定义props,为组件的属性,改属性可以是自定义属性,可以是element属性,可以是style,可以是class 14 //定义props的目的为了让父组件能够获取该内容,该vue的props定义,相当于java中的接口,具体值可以在这里定义默认值,可以在父组件中再定义或修改 15 [ //未详细定义都为string类型的props,若要定义每种props的具体类型,使用json格式 16 'labelText', //自定义一个label的内容 17 'pl', //使用一个属性placeholder 18 'value', //绑定一个值 19 'fontSize', //绑定一个style,font-size改为fontSize格式,类似style都以此方式修改定义 20 'clazz', //绑定一个class 21 ], 22 name: 'div-input', //组件的标签名 23 methods: { 24 keyups: function() { //定义一个keyup函数 25 console.log(this._props.value); //子组件中keyup函数中获取初始化的value 26 } 27 }, 28 } 29 </script> 30 <style scoped> 31 /*固定的style,不进行修改的内容*/ 32 .div-input-out { 33 margin: 10px; 34 } 35 36 .div-input { 37 height: 25px; 38 width: 400px; 39 border-radius: 4px; 40 padding: 5px 20px; 41 outline: none; 42 } 43 </style>
2.2.input组件的调用和定义(父组件)
注:父组件为子组件定义的class,必须是定义在子组件的style的scoped中的,定义在父组件的scoped中的并不起作用
1 <template> 2 <div id='app'> 3 this is my first demo 4 <button v-on:click="testClick()">测试获取value</button> 5 <hr> 6 <!--复用组件--> 7 <!--复用组件: labelText动态赋值--> 8 <!--复用组件: pl静态赋值--> 9 <!--复用组件: value动态绑定--> 10 <!--复用组件: fontsize静态赋值--> 11 <!--复用组件: clazz动态赋值--> 12 <lyh-input :labelText='input01.labelText' pl='请输入01' :value='input01.value' :fontSize='22' :clazz='input01.clazz'></lyh-input> 13 <lyh-input :labelText='input02.labelText' pl='请输入02' :value='input02.value' :fontSize='16' :clazz='input02.clazz'></lyh-input> 14 </div> 15 </template> 16 17 <script> 18 /* eslint-disable */ 19 // eslint-disable-next-line 20 import lyhInput from './components/input' //导入lyhInput 21 22 export default { 23 name: 'App', 24 data: function() { 25 return { 26 input01: { //第一个input 27 labelText: '第一个输入框的标题', //动态赋值props属性 28 clazz: 'meClazz', //动态赋值clazz属性给class 29 value: '001', //动态赋值value 30 }, 31 input02: { 32 labelText: '第二个输入框的标题', 33 clazz: 'meClazz', 34 value: '002', 35 }, 36 } 37 }, 38 methods: { 39 testClick: function() { //这里修改vue对象或属性 40 console.log(this.$children[0]); //获取当前子组件vue对象 41 console.log(this.$children[1]); 42 console.log(this.$children[0].$props); //获取当前子组件props对象 43 console.log(this.$children[1].$props); 44 console.log(this); //获取当前vue对象 45 console.log(this.$el); //获取当前vue对象对应的element自身的dom对象 46 }, 47 }, 48 components: { 49 lyhInput, 50 } 51 } 52 </script> 53 <style> 54 #app { 55 font-family: 'Avenir', Helvetica, Arial, sans-serif; 56 -webkit-font-smoothing: antialiased; 57 -moz-osx-font-smoothing: grayscale; 58 color: #2c3e50; 59 margin-top: 60px; 60 text-align: center; 61 } 62 </style>
各种绑定和获取方式都在代码和注释中了
3.相关效果的截图
注:
vue2.0以后去除了props的双重绑定功能,即禁止子组件在父组件调用中修改自身的props,因此也建议和官方的推荐一样使用,毕竟props的双向绑定会导致值得修改不明确
若必须需要双向绑定,网上有相应的解决方案,不贴了就。
建议定义好props以后,对props的修改只在父组件做。多数情况下,父组件需要修改子组件的props定义,说明该props不应该定义在子组件中,即该接口定义有误,或需要另一个组件