基于 Vue2 组件之间的通信

  • props / $emit

父组件通过props向子组件传递数据,子组件通过$emit和父组件通信
props只能是父组件向子组件进行传值

// 父组件代码
<template>
  <div class="home">
    <hello-world :msg="msg" @onMsg="toMsg"></hello-world>
    <br>
    <span>子组件传递过来的:{{msg_new}}</span>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
  name: 'HomeView',
  components: {
    HelloWorld
  },
  data(){
    return{
      msg: "我是父组件传递下去的值",
      msg_new: ""
    }
  },
  methods: {
    toMsg(p){
      this.msg_new = p
    }
  }
}
</script>

// 子组件代码
<template>
  <div class="hello">
    <p>父组件传递下来的:{{ msg }}</p>
    <button @click="goMsg">把值传递给父组件</button>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: ['msg'],
  methods: {
    goMsg(){
      // 定义自定义函数 将值传递给父组件
      this.$emit('onMsg',"567")
    }
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss">
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

  • eventBus事件总线($emit / $on)

兄弟组件之间的通信
利用 $emit 发送,则 $on 接收

// 父组件
<template>
  <div class="about">
    <event-b-one></event-b-one>
    <event-b-two></event-b-two>
  </div>
</template>
<script>
  import eventB_one from '@/components/eventB_one.vue'
  import eventB_two from '@/components/eventB_two.vue'
  export default{
    components: {
      eventB_one,eventB_two
    }
  }
</script>

// 子组件
<template>
    <div>
        <button @click="goEventB">我传给兄弟eventB_two</button>
    </div>
</template>
<script>
import {EventBus} from './event-bus.js'
export default {
    name: 'eventB_one',
    data(){
        return{
            num: 0
        }
    },
    methods: {
        goEventB(){
            EventBus.$emit('addition',{
                num: this.num++
            })
        }
    }
}
</script>
<style lang="less" scoped>

</style>

// 子组件
<template>
    <div>
        {{count}}
    </div>
</template>
<script>
import {EventBus} from './event-bus.js'
export default {
    name: 'eventB_two',
    data(){
        return{
            count: 0
        }
    },
    mounted(){
        EventBus.$on('addition', (p) => {
            console.log(p);
        })
    }
}
</script>
<style lang="less" scoped>

</style>

  • 依赖注入(provide / inject)

父子 父孙之间的组件通信
provide 钩子用来发送数据或方法
inject钩子用来接收数据或方法

<template>
    <div>
        <aprovide></aprovide>
    </div>
</template>
<script>
import Aprovide from '@/components/Aprovide.vue'
export default {
    components: {
        Aprovide
    },
    // 发送数据或方法
    provide(){
        return{
            num: 10
        }
    }
}
</script>
<style lang="less" scoped>

</style>

<template>
    <div>
        儿子组件:我接收了:{{num}}
        <bprovide></bprovide>
    </div>
</template>
<script>
import Bprovide from './Bprovide.vue'
export default {
    components: {
        Bprovide
    },
    // 接收数据或方法
    inject:['num']
}
</script>
<style lang="less" scoped>

</style>

<template>
    <div>
        孙子组件:我也接收了{{num}}
    </div>
</template>
<script>
export default {
    // 接收数据或方法
    inject:['num']
}
</script>
<style lang="less" scoped>

</style>

  • ref / $refs

ref属性是指向子组件的实例,通过实例来访问子组件的数据与方法

// 父组件
<template>
    <div>
        <ref ref="child"></ref>
        <button @click="go">加子组件的数</button>
    </div>
</template>
<script>
import ref from '@/components/ref.vue'
export default {
    components: {ref},
    methods: {
        go(){
            this.$refs.child.sayHello()
        }
    }
}
</script>
<style lang="less" scoped>

</style>

// 子组件
<template>
    <div>
        我是子组件:{{num}}
    </div>
</template>
<script>
export default {
    data(){
        return{
            num: 0
        }
    },
    methods: {
        sayHello () {
            this.num++
        }
    }
}
</script>
<style lang="less" scoped>

</style>

  • $parent / $children

$parent 访问父组件的实例
$children 访问子组件的实例

// 父组件
<template>
    <div>
        我是父组件:{{num}}
        <button @click="add">获取子组件的变量</button>
        <parent></parent>
    </div>
</template>
<script>
import parent from '@/components/parent.vue'
export default {
    name: "parentView",
    components:{parent},
    data(){
        return{
            num: 0
        }
    },
    mounted(){
    	// 获取子组件的所有实例 并且返回的是一个array的数组
        console.log(this.$children);
    }, 
    methods: {
        addNum(){
            this.num++;
        }
    }
}
</script>
<style lang="less" scoped>

</style>

// 子组件
<template>
    <div>
        <button @click="addNum">我是子组件的事件</button>
    </div>
</template>
<script>
export default {
    name: "parent",
    data(){
        return{
            msg1: "我是子组件的变量",
            msg2: "我是子组件的变量",
            msg3: "我是子组件的变量",
        }
    },
    methods: {
        addNum(){
            // 通过 $parent 访问父组件的实例
            this.$parent.addNum()
            // 以及变量
            console.log(this.$parent.num);
        }
    }
}
</script>
<style lang="less" scoped>

</style>
  • $attrs / $listeners

实现组件之间的跨代通信

// 父组件
<template>
    <div>
        <attrs :msg1="1" :msg2="2"></attrs>
    </div>
</template>
<script>
import attrs from '@/components/attrs.vue'
export default {
    components:{attrs}
}
</script>
<style lang="less" scoped>

</style>
// 子组件
<template>
    <div>
        我是子组件--{{msg1}}
        $attrs: {{$attrs}}
        <!-- v-bind="$attrs" 将值绑定  -->
        <attrs-view  v-bind="$attrs"></attrs-view>
    </div>
</template>
<script>
import attrsView from '@/components/attrsView.vue'
export default {
    components:{attrsView},
    props: ['msg1'],
    // inheritAttrs: false,
}
</script>
<style lang="less" scoped>

</style>
// 子组件下的子组件
<template>
    <div>
        我是子组件的子组件--{{msg2}}
    </div>
</template>
<script>
export default {
    props: ['msg2'],
    inheritAttrs: false,
}
</script>
<style lang="less" scoped>

</style>

  • 总结 - 组件间通信
  • 子组件通过注册监听事件,通过$emit来向父组件发送
  • 通过ref属性给子组件设置一个名字,可以访问子组件的实例 - this.$refs.自定义名字.
  • 而子组件通过 this. p a r e n t 来访问父组件的实例,相反父组件通过 t h i s . parent 来访问父组件的实例,相反 父组件通过 this. parent来访问父组件的实例,相反父组件通过this.chilerdn 来子组件的实例,这个返回是一个数组,而且返回顺序是不定的
  • 祖孙通信:通过 provide() 定义变量,接下来 inject 去接收变量
  • 兄弟组件:通过 new Vue() 一个实例作为组件间的中心点,发送使用 $emit() 接收使用 $on()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Vue实现组件堆叠式流程设计器是指使用Vue框架来构建一个可以让用户通过拖拽、堆叠组件的方式来设计流程的可视化工具。 Vue提供了强大的数据驱动和组件化开发的特性,非常适合用于实现流程设计器。首先,我们可以将每个流程节点封装成一个Vue组件,每个组件包含节点的展示、拖拽和连接等功能。用户可以通过拖拽节点来建立流程,并通过连接节点来定义流程的顺序。 其次,我们可以利用Vue的数据双向绑定和计算属性的特性,实现节点之间的数据传递和计算。例如,每个节点可以有输入参数和输出参数,用户可以通过在节点之间建立连接来传递参数。在Vue的计算属性中,我们可以根据节点之间的连接关系,实时计算节点的输出结果,并将结果反映在视图中。 另外,Vue还提供了强大的动画和过渡效果的支持,可以通过添加动画效果来增强用户交互体验。例如,当用户拖拽节点时,可以给节点添加拖拽的动画效果;当用户连接节点时,可以给连接线添加延展和收缩的过渡动画等。 最后,为了让用户能够保存和加载已设计的流程,我们可以使用Vue组件通信机制来实现父子组件之间的数据传递。用户可以点击保存按钮将流程数据传递给父组件,然后父组件可以将数据进行持久化保存或者向后端发送请求保存。加载已保存的流程时,父组件可以将数据传递给子组件进行展示。 总之,基于Vue实现组件堆叠式流程设计器可以充分发挥Vue框架的优势,提供可拓展、易用和强大的流程设计功能。这样的设计器可以为用户节省时间和精力,提高流程设计的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值