详解vue2父组件传递props异步数据到子组件的问题
测试环境:vue v2.3.3, vue v2.3.1 案例一父组件parent.vue
父组件
子组件child.vue
子组件{{childData}}
上面按照这里的解析,子组件的html中的{{childData}}的值会随着父组件的值而改变,但是created里面的却不会发生改变(生命周期问题) 案例二parent.vue
父组件
child.vue
子组件
{{childObject.items[0]}} created里面的却不会发生改变, 子组件的html中的{{{childObject.items[0]}}的值虽然会随着父组件的值而改变,但是过程中会报错 针对二的解决方法:使用v-if可以解决报错问题,和created为空问题
父组件
child.vue
子组件
{{childObject.items[0]}} 子组件使用watch来监听父组件改变的prop,使用methods来代替created parent.vue
父组件
child.vue
子组件
{{test}} 子组件watch computed data 相结合,有点麻烦 parent.vue
父组件
child.vue
子组件
{{test}} 使用emit,on,bus相结合 parent.vue
父组件
child.vue
子组件
{{test}} 这里使用了bus这个库,parent.vue和child.vue必须公用一个事件总线(也就是要引入同一个js,这个js定义了一个类似let bus = new Vue()的东西供这两个组件连接),才能相互触发 使用prop default来解决{{childObject.items[0]}} parent.vue
父组件
child.vue
子组件
{{childObject.items[0]}} 在说用vuex解决方法的时候,首先看看案例三 案例三main.js Vue.config.productionTip = false
import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ modules: { index } }) / eslint-disable no-new / new Vue({ el: '#app',store,router,template: '',components: { App } }) index.js const actions = {
asyncAction ({ commit }) { setTimeout(() => { commit('asyncMutation') },2000) } } const getters = { } const mutations = { export default { parent.vue
父组件
child.vue
子组件
{{$store.state.index.asyncData.items[0]}} {{$store.state.index.asyncData.items[0]}}可以取到改变的值,但是过程中还是出现这样的报错,原因同上 代码如下: 所以这里的解决方法是:vuex结合computed、mapState或者合computed、mapGetters parent.vue
父组件
child.vue
子组件
{{item0}} {{item}} index.js const actions = {
asyncAction ({ commit }) { setTimeout(() => { commit('asyncMutation',3]})// 作为参数,去调用mutations中的asyncMutation方法来对state改变 },2000) } } const getters = { getAsyncData: state => state.asyncData } const mutations = { export default { 注意上面的 如果写成这样的话 首先asyncAction是个异步的操作,所以asyncData默认值为空,那么还是导致,child.vue这里报0的错
子组件
{{item0}} {{item}} 不过根据以上的案例,得出来一个问题就是异步更新值的问题,就是说开始的时候有个默认值,这个默认值会被异步数据改变,比如说这个异步数据返回的object,如果你用props的方式去传递这个数据,其实第一次传递的空值,第二次传递的是更新后的值,所以就出现{{childObject.items[0]}}类似这种取不到值的问题,既然说第一次是空值,它会这样处理''.items[0],那么我们是不是可以在html判断这个是不是空(或者在computed来判断是否为默认值),所以把案例二的child.vue {{childObject != '' ? childObject.items[0]: ''}} 这样是可以通过不报错的,就是created是空值,猜想上面vuex去stroe也可以也可以这样做 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |