记录 Hippy-Vue 开发遇到的问题
1. 抽取子组件后,页面异常卡顿
处理数据一定要放在父组件中,如果放在子组件中,会非常卡,日志显示createNode达到5000多个。

优化后:

实际处理非常简单,就是请求回接口后,在父组件进行数据的处理,比如格式化日期等。
排查历程:排除了ul-li因素,key格式,this.$set,datalist => obj.list 减少data的赋值
注:经大佬指出,是vue子组件的更新机制,但是web和native的性能差别较大, 建议在官网文档中指出。
2. <p>{{汉字}}</p>
没有任何报错,加载不出来
类似的还有 :title="汉字"
,问题的关键是不提示任何报错,极其不友好。
注:如前所述,问题的关键是Native没有任何报错,直接白屏,而web上有提示,并且页面其他部分正常。
3. keep-alive保留了组件,hippy的路由参数变化,也不触发mounted
解决方法:既然mounted不会触发,就在activated中去再次请求数据。
注:与Hippy无关,是Vue-router机制。
4. 分享截图中,背景色为异常的黑色,正常页面为白色
解决:在shot-view上加上background-color: #fff
注:此为业务相关,不通用;background不生效
5. 分享截图中,用shot-view包裹住截图的部分,导致页面卡顿
在shot-view元素加上 position:relative;flex:1;
注:此为业务相关,不通用
6. 如何让Hippy的ul元素兼容H5?
为什么要兼容H5呢?
为了只写一套代码,而Hippy中ul的@loadMore和@endReached事件,H5显然不支持。
如何兼容?
写一个全局组件,判断当前环境,如果是Hippy环境,就用Hippy原生的ul,否则就用vant的list。
具体实现中,要注意数据的传递,van-list和hippy的ul需要的props不同。
index.hippy.vue
| <template>
<ul
:class="uClass"
:numberOfRows="dataLength"
@loadMore="loadMore"
@endReached="loadMore"
>
<slot />
</ul>
</template>
|
index.h5.vue
| <template>
<van-list
@load="loadMore"
>
<slot />
<div
v-if="finished"
:style="loadingH5Style"
>
没有更多了
</div>
<div
v-if="loading && dataLength"
:style="loadingH5Style"
>
加载中...
</div>
</van-list>
</template>
|
7. 如何用hippy提供的animation实现vue的loading?
Vue结构:
| <template>
<div class="loading-wrap">
<div class="loading-circle-wrap">
<animation
v-for="(item, index) of new Array(circleNumbers)"
:key="index"
playing
:actions="actions[index] || {}"
>
<span class="circle" />
</animation>
</div>
<p class="title">
正在加载...
</p>
</div>
</template>
|
Vue逻辑:
| function getActions(circleNumbers) {
const actions = [];
const unitDelay = 220;
for (let i = 0; i < circleNumbers; i++) {
actions.push({
opacity: {
startValue: 0,
toValue: 1,
duration: circleNumbers * unitDelay,
delay: unitDelay * i,
repeatCount: -1,
},
});
}
return actions;
}
export default {
mounted() {
this.onGetActions();
},
methods: {
onGetActions() {
const { circleNumbers } = this;
const actions = getActions(circleNumbers);
this.actions = actions;
},
},
}
|
CSS:
| .loading-wrap {
display: flex;
flex-direction: column;
align-items: center;
}
.loading-circle-wrap {
display: flex;
flex-direction: row;
}
.circle {
background-color: gray;
height: 0.16rem;
width: 0.16rem;
border-radius: 0.08rem;
margin-right: 10px;
opacity: 1;
}
.title {
font-size: 0.28rem;
}
|
同样地,由于animation元素只能在原生上使用,web上要用其他方案,就比较简单了。