Vue传值

246 阅读2分钟

父子之间

父传子

props

子传父

通过props传递过来的方法名 $emit('方法名',参数) 子组件通过参数传递给父

//子组件
<button @click="send2"></button>
methods:{
    send2(){
        this.$emit('send',"子组件像父组件传值",true)
    }
}
//父组件
<p v-on:send="b"></p>
methods:{
    b:function(data,data2){
        console.log(data,data2);
    }
}
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
</head>
<body>
<!-- 组件通信:父子、兄弟、跨级
父传子:props
子传父:$emit
 -->
<!-- 子传父:自定义事件
js的观察者模式:dispatchEvent,addEventListener
子组件用$emit()来触发事件,父组件用$on()来监听子组件的事件
 -->
 <!-- 父组件也可直接在子组件的自定义标签上使用v-on来监听子组件触发的自定义事件 
 即:父利用v-on监听子组件触发的自定义事件
 -->
<div id="app">
	<p>总数:{{total}}</p>
	<my-component
		@increase="handleGetTotal"
		@reduce="handleGetTotal"
	></my-component>
	<!--
	除了用v-on在组件上监听自定义事件,也可以监听DOM事件,
	用.native修饰符监听一个原生事件,监听该组件的根元素
	如何使用的
	 -->
	<!-- <my-component v-on:click.native="handleClick"></my-component> -->
</div>

<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<script>
	Vue.component('my-component',{
		props:[],
		template: `<div>
			<button @click="handleIncrease">+1</button>|
			<button @click="handleReduce">-1</button>|
		</div>`,
		data:function(){
			return {
				counter: 0
			}
		},
		methods: {
			handleIncrease: function(){
				this.counter++;
				this.$emit('increase',this.counter);
			},
			handleReduce: function(){
				this.counter--;
				this.$emit('reduce',this.counter);
				//此处的reduce用于html中的@reduce
				// $emit(自定义事件的名称,要传递的数据(0或多个))
			}
		}
	});
	var app = new Vue({
		el: '#app',
		data: {
			total: 0
		},
		methods: {
			handleGetTotal:function(total){
				this.total = total;
			}
		}
	})
</script>

</body>
</html>

子孙之间

Provide/inject

cn.vuejs.org/v2/api/?#pr… provude和inject用于开发高阶组件/组件库中使用,不推荐用于普通应用程序代码中

一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深。

  • provide应该是一个对象或返回一个对象的函数。
  • inject选项可是
    • 字符串数组
    • 一个对象,对象的key是本地的绑定名,value是:

注:provide和inject绑定的并不是可响应的。但如果传入了一个可监听的对象,则其对象的属性是可响应的。

//父组件提供'foo'
var Provider = {
    provide:{
        foo:'bar'
    },
}
//子组件注入'foo'
var Child = {
    inject:['foo'],
    created(){
        console.log(foo);//bar
    }
}

provide/inject结合symbol

const s = Symbol();
const Provider = {
    provide(){
        reutrn {
            [s]:'foo'
        }
    }
}
const Child = {
    inject:{s},
}

接下来 2 个例子只工作在 Vue 2.2.1 或更高版本。低于这个版本时,注入的值会在 props 和 data 初始化之后得到。 使用一个注入的值作为一个属性的默认值:

const Child = {
    inject:['foo'],
    props:{
        bar:{
            default(){
                return this.foo
            }
        }
    }
}

使用一个注入的值作为数据入口:

const Child = {
    inject:['foo'],
    data(){
        return {
            bar:this.foo
        }
    }
}

在 2.5.0+ 的注入可以通过设置默认值使其变成可选项:

const Child = {
  inject: {
    foo: { default: 'foo' }
  }
}

如果它需要从一个不同名字的属性注入,则使用 from 来表示其源属性:

const Child = {
  inject: {
    foo: {
      from: 'bar',
      default: 'foo'
    }
  }
}

与 prop 的默认值类似,你需要对非原始值使用一个工厂方法:

const Child = {
  inject: {
    foo: {
      from: 'bar',
      default: () => [1, 2, 3]
    }
  }
}

其他

父组件中转

<div>
    <h2></h2>
    <h3></h3>
</div>

需求:h2传递给h3 h2用$emit传递给div,div在使用v-bind传递给h3

Bus中央事件总线

<div>
    <h2></h2>
    <h3></h3>
</div>
//Bus.js
import Vue from 'Vue';
export default new Vue;

//h2
<button @click="send">点击按钮h2向h3传递</button>
import Bus from './api/Bus';
export default {
    data(){
        return {
            a:2
        };
    },
    methods:{
        send(){
            //Bus存数据:$emit
            Bus.$emit("send",this.a;"子组件像父组件传值");
        }
    }
}
//h3
import Bus from './api.Bus';
export default {
    data(){
        return {
            b:'',
            c:''
        };
    },
    created(){
        //Bus取数据:$on
        Bus.$on('send',(val,val2)=>{
            this.b=val;
            this.c=val2
        });
    }
}

Vuex

www.cnblogs.com/chen-yi-yi/…