父子组件传值
在父组件中改变子组件里的数据
ref属性应用和传值
父组件
<template>
<div class="ctn">
<input type="text" value="ref的用处" ref="input1" />
<button @click="add()">改变数据</button>
<!-- 2,添加ref属性放在组件上,可以获取子组件的所有方法 和数据-->
<Ref1 ref="childComp"></Ref1>
</div>
</template>
<script>
import Ref1 from "./ref1";
export default {
components: {
Ref1,
},
data() {
return {
fuVal: "父组件的值1",
};
},
mounted: function() {
console.log("获取子组件的数据", this.$refs.childComp.childval0);
console.log("获取子组件的方法", this.$refs.childComp.getList);
// 向子组件传值
this.$refs.childComp.getList(this.fuVal);
},
methods: {
add() {
// 1,通过ref获取dom元素,改变dom
this.$refs.input1.value = 22;
this.$refs.input1.style.color = "blue";
// 更新子组件的值,或调用子组件的方法
// this.$refs.childComp.childval0 = '新69';
},
},
};
// ref 需要在dom已经渲染完成后才会有,在使用的时候确保dom已经渲染完成。
// 比如在生命周期 mounted(){} 钩子中调用,或者在 this.$nextTick(()=>{}) 中调用。
</script>
子组件
<template>
<div>
<div class="box" ref="boxRef">{{ name }}</div>
<p>改变子组件的值:{{childval0}}</p>
<div>父组件传的值:{{ fuVal }}</div>
</div>
</template>
<script>
export default {
data() {
return {
childval0: "68",
name: "小小妹",
fuVal: "",
};
},
methods: {
newName() {
// 修改数据之后使用这个方法,获取更新后的 DOM
this.$nextTick(() => {
console.log(this.$refs.boxRef.textContent);
});
},
// 父组件传的值
getList(val) {
this.fuVal = val;
},
},
};
</script>
ref的基本应用:
一、父组件向子组件传递数据
在 Vue 中,可以使用 props 向子组件传递数据。
父组件部分:使用 v-bind 将值绑定上
<template>
<div class="ctn">
<div>
<div>
父传子: <input type="text" v-model="inputval">
</div>
<Zizujian :inputName="inputval" ></Zizujian>
</div>
</div>
</template>
<script>
import Zizujian from '@/components/zizujian.vue'
export default {
components:{
Zizujian
},
data(){
return{
inputval:'',
}
},
methods:{
}
}
</script>
子组件部分:
<template>
<div class="chir">
<div>
子组件接收: <p>{{inputName}}</p>
</div>
</div>
</template>
<script>
export default {
components:{
},
// 接受父组件的值
props: ['inputName'],
// props:{
// inputName: String
// },
data(){
},
}
</script>
从父组件接收值,就需要使用 props: ['inputName']
在 props 中添加了元素之后,就不需要在 data 中再添加变量了。
总结:在一个页面里,我们从服务器请求了很多数据,其中一些数据并不是页面的大组件来展示,而是让子组件来展示的。
所以需要父组件将数据传递给子组件(大组件请求数据,子组件用来展示)。
二、子组件向父组件传递数据
子组件主要通过事件 向父组件传递数据
1,子组件通过$emit()来触发事件
2,在父组件里,通过v-on自定义事件来监听
子组件部分:
<template>
<div class="childr">
<div>
<span>子组件传值</span>
<!-- 子传父的方法 -->
<button @click="childClick()">点击事件</button>
</div>
</div>
</template>
<script>
export default {
components:{
},
data(){
return{
childVal:'我是子组件的值001'
}
},
methods:{
childClick(){
this.$emit('childValClick', this.childVal)
}
}
}
</script>
首先声明一个事件方法 ,在事件里使用 $emit 来定义一个 要传递的方法,并带上值。
父组件部分:
<template>
<div class="ctn">
<div>
<span>子传父的值:{{childVal2}}</span>
<ZiZuJian v-on:childValClick="childValClick"></ZiZuJian>
<!-- 或者 @childValClick="childValClick" -->
</div>
</div>
</template>
<script>
import ZiZuJian from '@/components/zizujian.vue'
export default {
components:{
ZiZuJian
},
data(){
return{
childVal2:''
}
},
methods:{
// 子组件传值
childValClick(val){
this.childVal2 = val;
}
}
}
</script>
在父组件中,声明一个方法childValClick,获取子组件传递的参数
总结:我们整个操作的过程还是在子组件中完成,但是之后的展示交给父组件,
这样,就需要把子组件的值传递给父组件 。