组件间数据通信等问题
在开发中,一些公共的功能可以单独抽出来作为一个组件,比如下面这样:
我这边每个页面在远程获取数据渲染页面之前都有一个loading过渡状态,
因此就把该功能单独抽出来作为一个组件,
wxss,wxml,js每一次使用的时候都需要单独的import
wxss我嫌烦,就直接放到app.wxss内了,
< template name = "loader" > < view class = "container com-loader {{loadingHide}}" > < view class = "loading" > < view class = "loader-bd" > < view class = "notext" >没有更多啦</ view > < view class = "spinner" > < text class = "bounce bounce1" ></ text > < text class = "bounce bounce2" ></ text > < text class = "bounce bounce3" ></ text > </ view > </ view > </ view > </ view > </ template > |
let hide = 'hide' ; let animationName = 'sn-fade-in' ; const defaultData = { loadingHide: '' , animationName: '' } export default { data: defaultData, hidePageLoader() { this .setData({ loadingHide: hide, animationName: animationName }) }, showPageLoader() { this .setData(defaultData) } } |
如果我需要在主页面内操作组件的data和方法,目前是将二者合并为一个对象
import pageLoader from '../../components/loader/index' import deepAssign from '../../vendors/deep-assign' Page(deepAssign(mePage, pageLoader)) |
这样,如果组件比较多的话,对象合并肯定很耗内存,请问还有其他比较好的实现方式么?
另外,数据的变更,组件间数据的更新,也有问题。比如,我定义一个属性
data:{person:{name: 'aaa' ,age:10}} |
用setData的方式
this .setData({person:{name: 'phillyx' }}) |
person对象属性就直接覆盖了,age就没用了我这边也是通过deepAsssign强制刷新,没有单独的做脏数据检查
export const setData = (obj) => { var page = _getCurrentPage(); let o = deepAssign(page.data, obj); page.setData(o); }; |
这样效率很低,频繁更新数据的话,测试时会提示“该小程序导致微信变慢而终止”所以父子组件间的通信有什么好的解决方案么?