内容简介:1.1.1通过绑定 props 将父组件的数据关联到子组件,并修饰 .sync 或者用 v-model 同步来自子组件的数据变化1.1.2绑定 listener 事件监听器,当子组件状态或者数据发生变化时,触发事件并将数据传递到父组件$listeners 和 $attrs 两者表面层都是一个意思,$attrs 是向下传递数据,$listeners 是向下传递方法,通过手动去调用 $listeners 对象里的方法,原理就是 $emit 监听事件,$listeners 也可以看成一个包裹监听事件的一个对象。
1.父子组件间的数据传递
1.1从父组件获取子组件的数据
1.1.1通过绑定 props 将父组件的数据关联到子组件,并修饰 .sync 或者用 v-model 同步来自子组件的数据变化
//使用.sync :
//父组件
<template>
<div class="home">
<my-dialog :show.sync="valueChild"/>
<button @click="changeValue">toggle</button>
</div>
</template>
<script>
import myDialog from '@/components/myDialog.vue'
export default {
name: 'home',
components: {
myDialog
},
data(){
return{
valueChild:true,
}
},
methods:{
changeValue(){
this.valueChild = !this.valueChild
}
}
}
</script>
//子组件
<template>
<div>
<div>myDialog</div>
<div v-if="show">
<p>默认初始值是{{show}},所以是显示的</p>
<button @click.stop="closeDiv">关闭</button>
</div>
</div>
</template>
<script>
export default {
props:['show'],
methods:{
closeDiv(){
this.$emit('update:show',false)
}
}
}
</script>
// v-model :
//父组件:
<template>
<div class="home">
<myDialog v-model="show"></myDialog>
<button @click="toggle">Toggle</button>
</div>
</template>
<script>
import myDialog from '@/components/myDialog.vue'
export default {
name: 'home',
components: {
myDialog
},
data() {
return {
show: false
}
},
methods: {
toggle() {
this.show = !this.show
}
}
}
</script>
//子组件:
<template>
<div>
<div v-if="value" class="modal">
{{value}}
<button @click="close">x</button>
</div>
</div>
</template>
<script>
export default {
props: ['value'],
methods: {
close() {
this.$emit('input', false)
}
}
}
</script>
1.1.2绑定 listener 事件监听器,当子组件状态或者数据发生变化时,触发事件并将数据传递到父组件
$listeners 和 $attrs 两者表面层都是一个意思,$attrs 是向下传递数据,$listeners 是向下传递方法,通过手动去调用 $listeners 对象里的方法,原理就是 $emit 监听事件,$listeners 也可以看成一个包裹监听事件的一个对象。
// 父组件:
<template>
<div class="home">
{{firstMsg}}
<myDialog v-on:changeData="changeData" v-on:another='another'></myDialog>
</div>
</template>
<script>
import myDialog from '@/components/myDialog.vue'
export default {
name: 'home',
components: {
myDialog
},
data() {
return {
firstMsg: '父组件'
}
},
methods: {
changeData(params) {
this.firstMsg = params
},
another() {
alert(2)
}
}
}
</script>
//子组件:
<template>
<div>
<p @click="$emit('another')">子组件</p>
<other v-on="$listeners"/>
</div>
</template>
<script>
import other from '@/components/other.vue'
export default {
props: ['value'],
components:{
other
},
created () {
// eslint-disable-next-line no-console
console.log(this.$listeners)
}
}
</script>
//孙子组件:
<template>
<div>
<p @click='$listeners.changeData("change")'>孙子组件</p>
</div>
</template>
<script>
export default {
name: 'demo',
created () {
// eslint-disable-next-line no-console
console.log(this.$listeners)
},
}
</script>
1.2从子组件获取父组件的数据
1.2.1 获取 props 或者 $attrs 传下来的数据
//父组件:
<template>
<div class="home">
<myDialog :foo="foo" :boo="boo" :coo="coo" :doo="doo" title="前端工匠"></myDialog>
</div>
</template>
<script>
import myDialog from '@/components/myDialog.vue'
export default {
name: 'home',
components: {
myDialog
},
data() {
return {
foo: "Javascript",
boo: "Html",
coo: "CSS",
doo: "Vue"
}
},
methods: {
changeData(params) {
this.firstMsg = params
},
another() {
alert(2)
}
}
}
</script>
//子组件:
<template>
<div>
<p>foo:{{foo}}</p>
<p>子组件的$attrs: {{ $attrs }}</p>
<other v-bind="$attrs" />
</div>
</template>
<script>
import other from '@/components/other.vue'
export default {
components: {
other
},
inheritAttrs: false, // 可以关闭自动挂载到组件根元素上的没有在props声明的属性
props: {
foo: String // foo作为props属性绑定
},
created() {
// eslint-disable-next-line no-console
console.log(this.$attrs);
}
}
</script>
//孙子组件:
<template>
<div>
<p>boo: {{ boo }}</p>
<p>孙子:{{$attrs}}</p>
</div>
</template>
<script>
export default {
name: 'demo',
inheritAttrs: false,
props: {
boo: String
},
created() {
// eslint-disable-next-line no-console
console.log(this.$attrs);
},
}
</script>
2.兄弟组件间的数据传递
处于兄弟关系的组件
2.1通过 EventBus 或者 $root 去注册事件,由兄弟组件去监听事件传递过来的数据变化
2.2 在 Vuex 存放状态,并在两个组件中都监听状态变化
2.3 在父组件上绑定状态,并通过 v-model 或者 .sync 绑定到两个兄弟组件中去,以同步数据变化
3.祖孙组件间的数据传递
3.1孙组件被直接写在了祖先组件的 template 内
在 Vue 中,处于祖孙关系的组件,而且孙组件被直接写在了祖先组件的 template 内,要从祖先组件获取孙组件的数据,有以下几种方式:
3.1.1可以在模板上给孙组件绑定 ref 并通过 $refs 调用孙组件的方法获取数据
//父组件
<template>
<div class="home">
{{title}}
{{text}}
<myDialog ref="comA"></myDialog>
</div>
</template>
<script>
import myDialog from '@/components/myDialog.vue'
export default {
name: 'home',
components: {
myDialog
},
data() {
return {
title:'',
text:''
}
},
computed: {
},
mounted() {
const comA = this.$refs.comA;
// console.log(comA.title); // Vue.js
this.title = comA.title
this.text = comA.text
comA.sayHello(); // 弹窗
},
methods: {}
}
</script>
//子组件:
<template>
<div>
<div v-if="show">sayHello</div>
<other ref="comB" />
</div>
</template>
<script>
import other from '@/components/other.vue'
export default {
components: {
other
},
data() {
return {
title: 'Vue.js',
show: false,
text:''
}
},
created() {
},
mounted() {
const comB = this.$refs.comB;
this.text = comB.text
},
methods: {
sayHello() {
this.show = true
// window.alert('Hello');
}
}
}
</script>
//孙子组件:
<template>
<div>
</div>
</template>
<script>
export default {
name: 'demo',
data(){
return{
text:'c'
}
},
created() {
},
}
</script>
3.1.2 可以在模板上给孙组件绑定 listener 获取孙组件传过来的数据
3.1.3 可以在模板上给孙组件绑定 v-model 或者 .sync 同步孙组件的数据
3.2孙组件不在祖先组件的 template 内,要从祖先组件获取孙组件的数据
3.2.1先在子组件上绑定 v-model 或者 .sync,接着再在子组件的模板上通过 v-model 或者 .sync 绑定孙组件,以同步孙组件的数据
3.2.2现在孙组件上绑定 listener,再给子组件绑定 listener,数据由事件层层上传给祖先组件
3.3孙组件在祖先组件的 template 内,要从孙组件获取祖先组件的数据
3.3.1直接在祖先组件的 template 中通过 v-bind 将数据传递到孙组件中,孙组件通过 props 或者 $attrs 进行接收
3.4孙组件不在祖先组件的 template 内,要从孙组件获取祖先组件的数据
3.4.1先在子组件上 v-bind 绑定数据,接着再在子组件上通过 v-bind 绑定孙组件,数据层层向下传递
3.4.2孙组件在 EventBus 中注册事件,监听来自祖先组件触发的事件数据
3.4.3祖先组件将数据挂到 Vuex 中,再由孙组件从 Vuex 中去获取数据
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Node.js开发指南
郭家寶(BYVoid) / 人民邮电出版社 / 2012-7 / 45.00元
Node.js是一种方兴未艾的新技术,诞生于2009年。经过两年的快速变化,Node.js生态圈已经逐渐走向稳定。Node.js采用了以往类似语言和框架中非常罕见的技术,总结为关键词就是:非阻塞式控制流、异步I/O、单线程消息循环。不少开发者在入门时总要经历一个痛苦的思维转变过程,给学习带来巨大的障碍。 而本书的目的就是帮助读者扫清这些障碍,学会使用Node.js进行Web后端开发,同时掌握事件驱......一起来看看 《Node.js开发指南》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
HEX CMYK 转换工具
HEX CMYK 互转工具