一:常用写法
父组件
<template>
<div>
<aa class="abc" :snycTest.sync="test" ></aa>
{{'外面的值:' + test}}
<button @click="fn">
外面改变里面
</button>
</div>
</template>
<script>
import aa from './test.vue'
export default {
data () {
return {
test: ''
}
},
methods: {
fn () {
this.test += 1
}
},
components:{
aa
}
}
</script>
子组件
<template>
<div>
<ul>
<li>{{'里面的值:'+ snycTest}}</li>
<button @click="fn2">里面改变外面</button>
</ul>
</div>
</template>
<script>
export default {
props: {
snycTest: ''
},
methods: {
fn2 () {
this.$emit('update:snycTest', this.snycTest+1)
//这儿是关键 update:snycTest 自定义事件会告诉父组件将父组件的
//test值改为this.snycTest+1,并传回给子组件。
}
}
}
</script>
二:v-model写法
?上述代码可变为
父组件
<template>
<div>
<aa class="abc" v-model="test" ></aa> // 组件中使用v-model
{{'外面的值:' + test}} // 这儿试验test与内部msg值为双向绑定关系
<button @click="fn">
外面改变里面
</button>
</div>
</template>
<script>
import aa from './test.vue'
export default {
data () {
return {
test: ''
}
},
methods: {
fn () {
this.test += 1
}
},
components:{
aa
}
}
</script>
子组件
<template>
<div>
<ul>
<li>{{'里面的值:'+ msg}}</li>
<button @click="fn2">里面改变外面</button>
</ul>
</div>
</template>
<script>
export default {
model: { // 使用model, 这儿2个属性,prop属性说,我要将msg作为该组件被使用时(此处为aa组件被父组件调用)v-model能取到的值,event说,我emit ‘cc’ 的时候,参数的值就是父组件v-model收到的值。
prop: 'msg',
event: 'cc'
},
props: {
msg: ''
},
methods: {
fn2 () {
this.$emit('cc', this.msg+2)
}
}
}
</script>
三:v-bind="$attrs" 传递父组件prop、class、style;v-on="$listeners"传递父组件上的事件监听器和修饰符
假设引入了饿了么UI,把el-input二次封装
子组件
<template>
<el-input v-bind="$attrs" v-on="$listeners"></el-input>
绑定该两属性
</template>
<style scoped>
.el-input >>> .el-input__inner {
border-top: none;
border-left: none;
border-right: none;
}
</style>
父组件
<template>
<div>
<s-custom-wrap v-model="value" @focus="onInputFocus"></s-custom-wrap>
//v-model中的value可直接定义;focus事件可直接传递
</div>
</template>
<script>
import SCustomWrap from "./SCustomWrap";
export default {
components: {
SCustomWrap
},
data() {
return {
value:""
};
},
methods: {
onInputFocus() {
console.log("focus");
}
}
};
</script>
ps:个人简单记录,稍微不用就忘记了,编码粗糙格式混乱请轻喷
|