我们都知道uniapp现在已经支持了在subPackages里使用分包异步化,但是分包异步化之后总会出现一些问题,比如我这里这样写,测试用uview2组件的u-input在输入的时候,无论输入什么,框里总会出现object,object,而原生组件却会输入什么显示什么,网上问了一圈人也没有人解答。
难道要分包里的所有u-view的u-input的组件全部都换成原生input?
难道就这样放弃了uview阵营?
不不不。
一、问题跟踪
从图片中可以看到我们的u-input绑定了v-model事件,而v-model我们都知道他是一个双向绑定事件,即是从data到view,从view到data的互相绑定事件,会不会由于微信小程序dom没有加载完成之后,还没有加载我们uview分包,之后互相绑定,所以是失效的。
那么,咱们试一试,取消u-input的v-model属性,发现是正常的可输入的,输入什么显示什么,那么确定是哪个点的问题,我们就想解决办法。
二、解决办法
既然v-model不能使用,那我们就拆分v-model,其实v-model事件就是v-bind:value和@input事件的组合拳,跟方便面里的蔬菜包和酱包一样,他们组成了一包面。我们只要去掉v-model属性,换成:value和@input这两个属性就行了。
<view class="listTop" style="border: 0;padding: 0 40rpx;">
临床诊断
</view>
<view class="pt-40">
<u-input
placeholder-style="font-size:30rpx" :value="diagnose" @input="updateMessage($event, 'diagnose')" placeholder="请输入临床诊断" type="textarea"
height="100" :border="false"></u-input>
</view>
<view class="listTop " style="padding: 20rpx 40rpx 0;">
诊断依据
</view>
<view class="pt-40">
<u-input
:value="diagnosis_basic" @input="updateMessage($event, 'diagnosis_basic')" placeholder-style="30rpx" placeholder="请输入诊断依据" type="textarea"
height="140" :border="false"></u-input>
</view>
大家也看到了,我们@input这里写了一个函数,这个也就是我们用它来从view到data的数据绑定,把它加到vue的methods里就行。
updateMessage(event, targetProperty) {
this[targetProperty] = event.target.__args__[0];
}
这样做就会把v-model用:value和@input重新实现了一遍,如果你的target底下不是这个值,那么请换成你要的值。
三、更复杂的问题
event.target底下的值,我看了很多其实也不固定,如果你的项目里分包里原来代码也用到了@input方法,那可能改起来有些费事,需要找到要具体更改的值,然后更改才会生效。
比如我这个项目里下面这段代码,之前的人已经在view里监听了@input事件,而且还有别的method在调用这个@input绑定的method。所以,我们就没办法使用了,只能在他的代码里加我们需要的东西,而往往代码没有注释的话,是随着开发者主观意愿而变动的,我们根本猜不到这里具体在做什么,能猜个大概就知足了,所以我们只能多打log,多分析多看,祝大家中秋快乐。