详解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 = {
asyncMutation (state) {
state.asyncData = {'items': [1,3]}
}
}

export default {
state,actions,getters,mutations
}

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 = {
asyncMutation (state,params) {
state.asyncData = params.items[0] // 此时params={'items': [1,3]}被传过来赋值给asyncData,来同步更新asyncData的值,这样html就可以拿到asyncData.items[0]这样的值了
}
}

export default {
state,mutations
}

注意上面的

如果写成这样的话

首先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也可以也可以这样做

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

相关文章

问题现象 elmentui的el-tree数据加载问题,导致第一次加载选中当前节点和高亮当前节点没有生效。 解决方...
因为刚打开文件,vscode默认是预览状态,如果编辑过之后,就不会有这个问题。 可以通过双击将预览状态接...
前言 上篇文章我们介绍了国产SM4加密算法的后端java实现方案。没有看过的小伙伴可以看一下这篇文章。 h...
在项目中引入动态路由时报错 写法: 报错: Module build failed (from ./node_modules/_eslint-loader@2...
问题产生 在使用babel编译es6时,遇到报错Uncaught ReferenceError: regeneratorRuntime is not define...
父组件的编写 <a:orgCode=orgCode ></a> 在data里面增加...