vue中多组件嵌套传值、非父组件传值解决方法/在js中调用alert,alert作为父组件嵌套其他组件

组件嵌套传值/非父子组件传值

多组件嵌套props传值即可,但是如果非父子组件传值,借鉴别人的办法(万分感谢),给要传值的几个页面引入同一个bus.js,或者在main.js中 export var bus = new Vue(),如果报错$emit没有定义什么的就是路径问题

import {bus} form './main'


接着

//需要传送值的地方:
bus.$emit("a",值)

//需要接收的vue中同样引入,然后
bus.$on("a",(data)=>{
   //回调
    this.b=data
})

真好,传来传去页面太多差点精神错乱了,总结起来怎么就几个字的事情???

vue中多组件嵌套传值、非父组件传值解决方法/在js中调用alert,alert作为父组件嵌套其他组件

在项目中具体使用场景:

vue中多组件嵌套传值、非父组件传值解决方法/在js中调用alert,alert作为父组件嵌套其他组件

 

alert封装、调用、嵌套、传值 

用到这个东西的缘故是老大说封装一个alert,然后日历、小贴士,list啥的通过点击 “组件1”  弹出 alert触发,alert作为一个载体,承载其他组件。刚刚将功能实现,记录一下

alert.vue

  <div class="alert-mask" @click.self="close" v-show="show">
      <div class="alert"  >
        <div :class="[title?title:'']">{{title}}</div>
        <div class="body">
          <p>{{text}}</p>
          <component  v-bind:is="comp" ></component>
        </div>
        <div :class="[confirmMsg?footer:'']" @click="close">{{confirmMsg}}</div>
      </div>
  </div>
  data () {
    return {
      //show在data
      show: false
    }
  },

 

alert.js

import al from './文件.vue'
let Al = {} // 此处是弹窗空对象
let vm = null // vue实例
Al.install = (Vue, options) => {
  if (!vm) {
    // Vue.extend=》扩展实例构造器,挂载到div元素上
    const Al= Vue.extend(al)
    vm = new Al({
      el: document.createElement('div')
    })
  }
  const alertPl = {
    show (options = {}) { // 参数
      vm.show = true
      if (options) {
        //此处添加参数
        options.el.appendChild(vm.$el)
      }
    },
    hide (el) {
      vm.show = false
    }
  }
}
export default AlertPlug

定义的时候尽量不用alert,避免莫名其妙的冲突 

vue中多组件嵌套传值、非父组件传值解决方法/在js中调用alert,alert作为父组件嵌套其他组件

调用 

周报list组件点击后在js中调用,this.$alertPI.show()

关闭弹窗:this.$alertPI.hide()

向alert内部传递一个组件 

给alert传递的参数中需传递一个组件名称

vue中多组件嵌套传值、非父组件传值解决方法/在js中调用alert,alert作为父组件嵌套其他组件

       alert中<component v-bind:is="comp"></component>用来展示组件,而且alert中得引入要调的所有组件,再通过comp接收的组件名字决定渲染哪一个,为什么要这样呢,因为凭我有限的本事,没其他办法了,尝试给comp传递一个组件<v-comp :title="title"></v-comp>但是行不通,同事尝试出了<component>,真机智

        接下来解决的是不同的组件需要传递不一样的参数,解决方法就是给alert的参数中添加一个plugVal对象,alert.js中

vue中多组件嵌套传值、非父组件传值解决方法/在js中调用alert,alert作为父组件嵌套其他组件

alert.vue中需要接收,alert中的组件list要用,那么就在<component :a="plugVal> ,一下,然后在list中props一下

对于内部组件不显示问题:由于alert参数中调用alert后vm.show=false,在alert的 component标签上绑定一个 :visible.sync="show",传给组件list,

接收:

    show: {
      type: Boolean,
      default: true
    }

为什么要true,因为false不行

vue中多组件嵌套传值、非父组件传值解决方法/在js中调用alert,alert作为父组件嵌套其他组件

 

 

 

调用alert时动画失效

在之前的alert插件中加了动画效果,但是发现改为js调用后动画效果没有了

  <div class="alert-mask" @click.self="close" v-show="show">
    <transition :duration="1588" appear
      enter-active-class="animated bounceIn"> 
      <div class="alert">
        
      </div>
    </transition>
  </div>

解决办法,直接将动画的class添加到div上而非transition上

  <div class="alert-mask" @click.self="close" v-show="show">
      <div class="alert animated bounceIn">
      </div>
  </div>