1,父传子
父组件通过props向下传递数据给子组件
//App.vue父组件 <template> <div id="app"> <users v-bind:users="users"></users>//前者自定义名称便于子组件调用,后者要传递数据名 </div> </template> <script> import Users from "./components/Users" export default { name: 'App', data(){ return{ users:["Henry","Bucky","Emily"] } }, components:{ "users":Users } } //users子组件 <template> <div class="hello"> <ul> <li v-for="user in users">{{user}}</li>//遍历传递过来的值,然后呈现到页面 </ul> </div> </template> <script> export default { name: 'HelloWorld', props:{ users:{ //这个就是父组件中子标签自定义名字 type:Array, required:true } } } </script>
2,子传父
#ref传值
#通过事件形式:子组件通过$emit()给父组件发消息,父组件通过v-on绑定事件接收数据
//zi zujian <template> <p @click="change">{{title}}//绑定点击事件 </p> </tempalte> <script> export default{ name:"app-header" data:{ return { title:"vue" } }, methods:{ change(){ this.$emit("zichaunfu","传值")//自定义事件,穿的值是”传值 } } } </script> //父组件 <template> //与子组件自定义事件名字保持一致,data表示从子组件传过来的数据 <app-header v-on:zichaunfu="data" ></app-header> <p>{{title}} </p> </template> <script> import app-header from "./compents" export default{ name:"app", data(){ return{ title:"传递过来是一个值" } }, methods:{ data(e){//声明这个函数 this.title=e } }, compents:{ "app-heander":header, } } </script>
子组件通过events给父组件发送消息,实际上就是子组件把自己的数据发送到父组件
3,兄弟组件传值
原理:
var event =new vue() event.$emit(事件名,数据) event.$on(事件名,data=》{})//箭头函数内部不会产生新的this,这边如果不用=》,this指代event
从c组件获取a和b组件的值 <div id="itany"> <my-a></my-a> <my-b></my-b> <my-c></my-c> </div> <template id="a"> <div> <h3>A组件:{{name}}</h3> <button @click="send">将数据发送给C组件</button> </div> </template> <template id="b"> <div> <h3>B组件:{{age}}</h3> <button @click="send">将数组发送给C组件</button> </div> </template> <template id="c"> <div> <h3>C组件:{{name}},{{age}}</h3> </div> </template> <script> var Event = new Vue();//定义一个空的Vue实例 var A = { template: '#a', data() { return { name: 'tom' } }, methods: { send() { Event.$emit('data-a', this.name); } } } var B = { template: '#b', data() { return { age: 20 } }, methods: { send() { Event.$emit('data-b', this.age); } } } var C = { template: '#c', data() { return { name: '', age: "" } }, mounted() {//在模板编译完成后执行 Event.$on('data-a',name => { this.name = name;//箭头函数内部不会产生新的this,这边如果不用=>,this指代Event }) Event.$on('data-b',age => { this.age = age; }) } } var vm = new Vue({ el: '#itany', components: { 'my-a': A, 'my-b': B, 'my-c': C } }); </script>
4,任意组件传值(vuex)
Vuex实现了一个单向数据流,在全局拥有一个State存放数据,当组件要更改State中的数据时,必须通过Mutation进行,Mutation同时提供了订阅者模式供外部插件调用获取State数据的更新。而当所有异步操作(常见于调用后端接口异步获取更新数据)或批量的同步操作需要走Action,但Action也是无法直接修改State的,还是需要通过Mutation来修改State的数据。最后,根据State的变化,渲染到视图上。
###vuex和localstorage关系
vuex是vue的状态管理器,储存的数据是响应式的。但是不会保存起来,一刷新就会丢失,所以可以把vuex的数据保存一份到localstorage里面,刷新之后,如果localstorage里面有保存的数据,取出来替换store里的state
let defaultCity = "上海" try { // 用户关闭了本地存储功能,此时在外层加个try...catch if (!defaultCity){ defaultCity = JSON.parse(window.localStorage.getItem('defaultCity')) } }catch(e){} export default new Vuex.Store({ state: { city: defaultCity }, mutations: { changeCity(state, city) { state.city = city try { window.localStorage.setItem('defaultCity', JSON.stringify(state.city)); // 数据改变的时候把数据拷贝一份保存到localStorage里面 } catch (e) {} } } })
再vuex中,保存的状态都是数组,而localstorage只支持字符串,所以需要转化一下
Json.parse(localstorage.getitem("")) string---->array
json.stringify(state.sub) array=====>string
5,祖孙组件传值(provide/inject)
以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。一言而蔽之:祖先组件中通过provider来提供变量,然后在子孙组件中通过inject来注入变量。 provide / inject API 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。
//a.vue export default{ provide:{name:"haha "} } //b.vue export default{ inject:["name"] mounted:{ log("this.name")//haha } }
需要注意的是:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的