props ——> properties 属性、特性
1、通过props向子组件传递数据
绑定属性时要用v-bind才会传递变量,不加传过来的是字符串
2、子组件通过自定义事件($emit)向父组件发送消息
父子组件结合双向绑定
body区域
<div id="app">
<cpn :number1='num1' :number2='num2' @num1change='num1change' @num2change='num2change'></cpn>
</div>
<template id="cpn">
<div>
<h2>props:{{number1}}</h2>
<h2>data:{{dnumber1}}</h2>
<!-- <input type="text" v-model=' dnumber1 '> -->
<input type="text" :value='dnumber1' @input='num1Input'>
<h2>props:{{number2}}</h2>
<h2>data:{{dnumber2}}</h2>
<!-- <input type="text" v-model='dnumber2 '> -->
<input type="text" :value='dnumber2' @input ='num2Input'>
</div>
</template>
js语句
var vm = new Vue({
el: '#app',
data: {
num1: 0,
num2: 1
},
methods: {
num1change(value) {
// console.log(value);
this.num1 = Number(value)
},
num2change(value) {
this.num2 = Number(value)
}
},
components: {
cpn: {
template: '#cpn',
// 不建议子元素直接修改props里的值
props: {
number1: Number,
number2: Number
},
// 修改的值建议放在data里面
data() {
return {
dnumber1: this.number1,
dnumber2: this.number2
}
},
methods: {
num1Input(event) {
// 将input中的value值赋到dnumber中
this.dnumber1 = event.target.value;
// console.log(this.dnumber1);
// 让父组件修改值,发出一个事件
this.$emit('num1change', this.dnumber1);
// 同时修改dnumber2的值
this.dnumber2 = this.dnumber1 * 10;
this.$emit('num2change', this.dnumber2)
},
num2Input(event) {
this.dnumber2 = event.target.value;
this.$emit('num2change', this.dnumber2);
this.dnumber1 = this.dnumber2 / 10;
this.$emit('num1change', this.dnumber1)
},
}
}
}
})
watch父子组件结合双向绑定
body区域
<div id="app">
<cpn :number1='num1' :number2='num2' @num1change='num1change' @num2change='num2change'></cpn>
</div>
<template id="cpn">
<div>
<h2>props:{{number1}}</h2>
<h2>data:{{dnumber1}}</h2>
<input type="text" v-model=' dnumber1 '>
<!-- <input type="text" :value='dnumber1' @input='num1Input'> -->
<h2>props:{{number2}}</h2>
<h2>data:{{dnumber2}}</h2>
<input type="text" v-model='dnumber2 '>
<!-- <input type="text" :value='dnumber2' @input ='num2Input'> -->
</div>
</template>
js语句
var vm = new Vue({
el: '#app',
data: {
num1: 0,
num2: 1
},
methods: {
num1change(value) {
// console.log(value);
this.num1 = Number(value)
},
num2change(value) {
this.num2 = Number(value)
}
},
components: {
cpn: {
template: '#cpn',
props: {
number1: Number,
number2: Number
},
data() {
return {
dnumber1: this.number1,
dnumber2: this.number2
}
},
methods: {
},
watch: {
dnumber1(newValue) {
this.dnumber2 = newValue * 10;
this.$emit('num1change', newValue)
},
dnumber2(newValue) {
this.dnumber1 = newValue / 10;
this.$emit('num2change', newValue)
},
}
}
}
})