vue 组件与全局数据传递共享方式

  ,父子组件间数据传递
  实际工作中会遇到一些复用程度高的功能,自己会封装小组件全局调用,在组件中通过自定义props里的值,例如:

       

  在需要调用的组件中先import 组件进来,自定义标签引入,在标签上传入props接受的参数:

       

  

二、父组件调用子组件属性与方法 - $ref 、$parent

this.$refs.hw.xx = 'xxx'

this.$children[0].xx = 'xxx'

 

三、通过 $attar 、$listener

 

$attrs

 

把父组件中非props属性绑定到内部组件

 

$listeners

 

把父组件中的DOM对象的原生事件绑定到内部组件

 

 

四、v-model

五、插槽

 

// ComA
<div>
    <slot></slot>
    <slot name="content"></slot>
</div>

// 使用
<com-a>
    <template v-slot:default>具名插槽</template>
    <template v-slot:content>自定义插槽</template>
</com-a>

 

  

 

六、project / inject:能够实现祖先给后代传值

 

// ancestor
provide() {
  return { foo: 'foo'}      
}

// descendant
inject: ['foo']

 

  

 

 七、事件总线:创建一个Bus类负责事件派发、监听和回调管理

 

// Bus:事件派发、监听和回调管理
class Bus{
    
    constructor(){
        this.callbacks = {}
    }
    $on(name, fn){
        this.callbacks[name] = this.callbacks[name] || []
        this.callbacks[name].push(fn)
    }
    $emit(name, args){
       if(this.callbacks[name]){
            this.callbacks[name].forEach(cb => cb(args))
        }
    }
}
// main.js
Vue.prototype.$bus = new Bus()
// child1
this.$bus.$on('foo', handle)
// child2
this.$bus.$emit('foo')   

 

  

 

七、文件可读可写

  使用场景中经常出现,多个组件需要相同的接口返回数据进行处理,纯粹按请求很频繁会影响性能跟体验感,然后从上个方法在深入探索了下,

将这些数据放在全局“变量”里,可读可写:

        

   在入口文件main.js里注入,即可在所有组件读写变量

     

        

  似乎是可以了,但在这有问题全局变量初始值为空,刷新时,各模块同时加载,父级组件接口未执行完成取得数据写入文件,子组件程序就已经执行完成,所以是取不到数据的,

  一开始想的是promise思路,终究就是个加载顺序问题,通过路由加载可处理。

 

 八、vuex:创建唯一的全局数据管理者store,通过它管理数据并通知组件状态变更

  

 

 

  

 

posted @ 2019-01-18 14:51  超小级小萝莉  阅读(4662)  评论(0编辑  收藏  举报