问题描述
input输入时,输入框的值不显示为js设置的值
复现步骤
1.
this.state = { val: '' };
2.
<Input value={this.state.val} onInput={this.onInput.bind(this)}></Input>
3.
onInput(e) {
let value = e.detail.value;
value = value.replace(/[^a-zA-Z]/g, '');
this.setState({ val: value });
this.forceUpdate();
}
4.
输入框先输入一个字符串abcd,再次输入字符之外的字符时(比如: abcd------), 输入框应该显示 abcd, 但还是显示的abcd------
使用this.forceUpdate()input的值还是不更新。
期望行为
输入框的值能正常显示
报错信息
系统信息
Taro v1.2 及以上版本已添加
taro info命令,方便大家查看系统及依赖信息,运行该命令后将结果贴下面即可。
Taro CLI 1.2.22 environment info:
System:
OS: macOS 10.14.3
Shell: 5.3 - /bin/zsh
Binaries:
Node: 10.15.1 - ~/.nvm/versions/node/v10.15.1/bin/node
npm: 6.4.1 - ~/.nvm/versions/node/v10.15.1/bin/npm
欢迎提交 Issue~
如果你提交的是 bug 报告,请务必遵循 Issue 模板的规范,尽量用简洁的语言描述你的问题,最好能提供一个稳定简单的复现。🙏🙏🙏
如果你的信息提供过于模糊或不足,或者已经其他 issue 已经存在相关内容,你的 issue 有可能会被关闭。
Good luck and happy coding~
@ccqgithub 哪个端?
@Chen-jj 小程序
现在我是这样解决的:
// 更新字段
updateField(field, e) {
let originValue = e.detail.value;
let value = formatField(originValue, field);
// taro bug, 值没改变是不setData
if (this.state[field] === value) {
this.setState({ [field]: originValue });
setTimeout(() => {
this.setState({ [field]: value }, () => {
this.validate();
});
});
} else {
this.setState({ [field]: value }, () => {
this.validate();
});
}
}
@ccqgithub 微信小程序中表单组件不是完全受控的,Input 组件输入后,视图立即变化,但其 value 绑定的值还是旧值,这时你直接 setState 一个旧值会被 Taro 的 diff 过滤掉。
例如:
输入 a。
视图显示 a。
onInput 逻辑处理后 setState({ val: 'a' })
taro diff('a', '')
setData({ val: 'a' })
输入 1。
视图显示 a1。
onInput 逻辑处理后 setState({ val: 'a' })
taro diff('a', 'a')
不去 setData
解决的办法在于视图改变时,立即同步 data,然后再对 data 值进行进一步修改。
onInput(e) {
let value = e.detail.value
this.setState({ val: value })
setTimeout(() => this.setState({ val: value.replace(/[^a-zA-Z]/g, '') }))
}
Hello~
您的问题楼上已经有了确切的回答,如果没有更多的问题这个 issue 将在 15 天后被自动关闭。
如果您在这 15 天中更新更多信息自动关闭的流程会自动取消,如有其他问题也可以发起新的 Issue。
Good luck and happy coding~
好的谢谢😄
@ccqgithub 微信小程序 2.1.0 起支持 onInput 事件回调 return 一个值去修改输入框的值,可以忽略我刚刚的回答。

这样改:
onInput(e) {
let value = e.detail.value
value = value.replace(/[^a-zA-Z]/g, '')
this.setState({ val: value })
return value
}
需要保留 setState 供其它端修改输入框值。
我们将修改文档,添加到 debug 指南。
我试了下,新版本taro这个问题已经修好了
taro 1.3.19
@Chen-jj 麻烦问下 h5中为什么也会出现这样的问题呢
@qiuziz 先升级下吧
@qiuziz 先升级下吧
@Chen-jj 公司项目,暂时没有升级计划。
就是想问下,如果说小程序中是由于input是非完全受控组件,那么h5中为什么也会出现同样的问题?这里有点疑惑
Most helpful comment
@ccqgithub 微信小程序中表单组件不是完全受控的,Input 组件输入后,视图立即变化,但其 value 绑定的值还是旧值,这时你直接 setState 一个旧值会被 Taro 的 diff 过滤掉。
例如:
输入 a。
视图显示 a。
onInput 逻辑处理后 setState({ val: 'a' })
taro diff('a', '')
setData({ val: 'a' })
输入 1。
视图显示 a1。
onInput 逻辑处理后 setState({ val: 'a' })
taro diff('a', 'a')
不去 setData
解决的办法在于视图改变时,立即同步 data,然后再对 data 值进行进一步修改。