vue传递值传递,slot

slot传递数值
  • parent.vue
//在父组件里面通过slot-scope='p',{{p.属性}}来获取属性值,slot属性来获取子组件插槽,以name作为区分
<template>
<B :color="dataColor">
  <div slot="app" slot-scope="p">slot--{{p.slotName}}</div>
</B>
</template>
  • child.vue
//子组件里面通过slot插槽,里面标明属性name来区分不同slot,通过v-bind:属性,
//在父组件里面通过slot-scope='p',{{p.属性}}来获取属性值
<template>
    <div>
        {{color}}--{{$attrs.color}}
        <slot name="app" :slotName="slotName"></slot>
        <button @click="changeSlot">改变slot</button>
    </div>

</template>
通过 o n on, emit传值
  • 具体实现方式
var Event=new Vue();
Event.$emit(事件名,数据);
Event.$on(事件名,data => {});
  • 实现示例
    • a.vue
   <template>
  <div>
    <button @click="send">发送a</button>
    <B></B>
    <C></C>
  </div>
</template>
<script>
  import B from './B.vue'
  import C from './C.vue'
  import util from '../util/util'
    export default {
        data(){
            return{
              name:'aaa'
            }
        },
        methods:{
          send(){
              util.Event.$emit('data-a',this.name);
          }
        },
        components:{
            B:B,
            C:C
        }
    }
</script>
<style scoped>
</style>
  • b.vue
<template>
 <div>
     aaa
     <button @click="send">发送b</button>
 </div>

</template>

<script>
 import util from '../util/util'
 export default {
     data(){
       return{
         age:20
       }
     },
     methods:{
       send(){
           util.Event.$emit('data-b',this.age);
       }
     }
 }
</script>

<style scoped>

</style>

  • c.vue
<template>
 <div>
     {{name}}--{{age}}
 </div>
</template>

<script>
import util from '../util/util'
 export default {
     data(){
       return{
         name:'ccc',
         age:''
       }
     },
   mounted(){
       util.Event.$on('data-a',name=>{
         this.name=name;
       })
       util.Event.$on('data-b',age=>{
         this.age=age;
       })
   }
 }
</script>

<style scoped>

</style>

  • util.js
import Vue from 'vue'
var obj={
Event:new Vue()
}
export default obj;

vuex
  • dispatch:操作行为触发方法,是唯一能执行action的方法。
  • actions:操作行为处理模块,由组件中的$store.dispatch(‘action 名称’, data1)来触发。然后由commit()来触发mutation的调用 , 间接更新 state。负责处理Vue Components接收到的所有交互行为。包含同步/异步操作,支持多个同名方法,按照注册的顺序依次触发。向后台API请求的操作就在这个模块中进行,包括触发其他action以及提交mutation的操作。该模块提供了Promise的封装,以支持action的链式触发。
  • commit:状态改变提交操作方法。对mutation进行提交,是唯一能执行mutation的方法。
  • mutations:状态改变操作方法,由actions中的commit(‘mutation 名称’)来触发。是Vuex修改state的唯一推荐方法。该方法只能进行同步操作,且方法名只能全局唯一。操作之中会有一些hook暴露出来,以进行state的监控等。
  • state:页面状态管理容器对象。集中存储Vue components中data对象的零散数据,全局唯一,以进行统一的状态管理。页面显示所需的数据从该对象中进行读取,利用Vue的细粒度数据响应机制来进行高效的状态更新。
  • getters:state对象读取方法。图中没有单独列出该模块,应该被包含在了render中,Vue Components通过该方法读取全局state对象。
$attrs/$listeners
  • $attrs:包含了父作用域中不被 prop 所识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件。通常配合 inheritAttrs 选项一起使用。
  • $listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件
  • $attrs与$listeners 是两个对象,$attrs 里存放的是父组件中绑定的非 Props 属性,$listeners里存放的是父组件中绑定的非原生事件。
  • 实例
  • a.vue
<template>
  <div>
    <button @click="send">发送a</button>
    <B :foo="foo" :boo="boo" :coo="coo" :doo="doo" title="前端工匠" @click="send"></B>
  </div>
</template>

<script>
  import B from './B.vue'
  import util from '../util/util'
    export default {
        data(){
            return{
                name:'aaa',
                foo: "Javascript",
                boo: "Html",
                coo: "CSS",
                doo: "Vue"
            }
        },
        methods:{
          send(){
              util.Event.$emit('data-a',this.name);
          }
        },
        components:{
            B:B,
        }
    }
</script>

<style scoped>

</style>

  • b.vue
<template>
    <div>
        <C></C>
    </div>

</template>

<script>
    import util from '../util/util'
    import C from './C.vue'
    export default {
        data(){
          return{
            age:20
          }
        },
        props:{
            foo:String
        },
        created(){
          console.log(this.$attrs); //{boo: "Html", coo: "CSS", doo: "Vue", title: "前端工匠"}
        },
        methods:{
          send(){
              util.Event.$emit('data-b',this.age);
          }
        },
        components:{
            C:C
        }
    }
</script>

<style scoped>

</style>

provide/inject

允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效

  • a.vue
<template>
  <div>
    <B ></B>
  </div>
</template>
<script>
  import B from './B.vue'
    export default {
      provide:{
        name:"我是父组件"
      },
        data(){
            return{
            }
        },
        components:{
            B:B,
        }
    }
</script>
<style scoped>
</style>
  • B.vue
<template>
    <div></div>
</template>
<script>
    export default {
        inject:['name'],
        mounted(){
            console.log(this.name);//我是父组件
        }
    }
</script>
<style scoped>
</style>

在 A.vue 里,我们设置了一个 provide: name,值为 浪里行舟,它的作用就是将 name 这个变量提供给它的所有子组件。而在 B.vue 中,通过 inject 注入了从 A 组件中提供的 name 变量,那么在组件 B 中,就可以直接通过 this.name 访问这个变量了,它的值也是 我是父组件。这就是 provide / inject API 最核心的用法。

需要注意的是:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的----vue官方文档
所以,上面 A.vue 的 name 如果改变了,B.vue 的 this.name 是不会改变的,仍然是 我是父组件

猜你喜欢

转载自blog.csdn.net/qq_33332184/article/details/90707174