在同一个项目中好多用到了 TextInput 组件,但是都没有问题,突然有一天给一个TextInput加上了defaultValue属性后中文居然无法输入了!!!,撤销回去又可以输入了,然后试了一下value属性也是不行,同样无法输入,这是怎么回事???
于是baidu了一下问题所在,按照网上的教程配置了一下:
shouldComponentUpdate (nextProps){
return Platform.OS !== 'ios'
|| (this.props.value === nextProps.value && (nextProps.defaultValue == undefined || nextProps.defaultValue == '' ))
|| (this.props.defaultValue === nextProps.defaultValue && (nextProps.value == undefined || nextProps.value == '' ));
}
这是网上给的方法,那好,拿过来试试吧!万事准备齐全,那就干吧,项目启动,怀着忐忑的心情试了一下,结果非常不幸,居然不管用!!!这是为什么???
没办法,既然网上的教程不管用,那就自己找找原因:
- 把defaultValue或者value删除,确定能输入中文,没问题
- 添加上defaultValue或者value后不能输入中文
- 先前是这样写的defaultValue={this.state.text},换一下思路,直接把this.state.text替换掉,改成defaultValue={‘测试’},运行项目,输入框出现‘测试’字样,然后切换成中文输入法,打字,咦,居然成功了!!!成功了!!!哇什么原理???
- 既然直接写死可以,也就是在使用 this.state.text的时候不行(什么原理暂时还没研究),那就好办了
直接上解决办法:
定义全局变量 this.text =‘’;修改defaultValue={this.text},然后在需要给输入框赋值的函数中使用this.text=‘你要赋值的内容’;
这样还不行,因为这样没有render 所以页面不会刷新,this.text的值也不会出现在页面上,只需要在this.text=‘你要赋值的内容’下边加上this.setState={xxxx:xxxx},就可以了
做完一切测试一下,完全可以了。在此记录一下,也分享给有此问题的朋友
在使用网上的那种方法可行的基础上测试了一下,这种方法也是可以的。
有问题欢迎留言,本人看到及时回复!!!谢谢
注:
shouldComponentUpdate (nextProps){
return Platform.OS !== 'ios'
|| (this.props.value === nextProps.value && (nextProps.defaultValue == undefined || nextProps.defaultValue == '' ))
|| (this.props.defaultValue === nextProps.defaultValue && (nextProps.value == undefined || nextProps.value == '' ));
}
换成下边这种操作就可以使用了:
shouldComponentUpdate(nextProps, nextState) {
if (Platform.OS === 'ios') {
if (this.state.text!== nextState.text) { //text为所要获得的TextInput输入值,
return false;
}
}
return true;
};
不过这时候也有个小问题:附图:
历史记录的这种情况,点击历史记录中的选项时,需要点击两次,才能输入到TextInput中
有问题欢迎留言,本人看到及时回复!!!谢谢