【发布时间】:2017-09-28 07:02:03
【问题描述】:
我正在尝试使用 react/redux 去抖动 textarea 值并在 div#preview 中显示去抖动值,但在第一次函数调用后我收到合成事件警告。
我有用于处理按预期工作的 textarea 值状态的 reducer,但为简单起见,我在此 sn-p 中编写了本地状态。
如果除了debounce 之外还有更好的方法来避免在每个keypress 之后重新渲染,我很想知道。提前致谢。
class TextArea extends React.Component {
constructor(props){
super(props);
this.state = {foo: ''}
}
handleInputChange = _.debounce((e) => {
e.persist();
let value = e.target.value;
this.setState({foo: value});
}, 300);
render() {
return (
<div>
<textarea onChange={(e)=>this.handleInputChange(e)} value={this.state.foo}></textarea>
<p id="preview">{this.state.foo}</p>
</div>
);
}
}
ReactDOM.render(
<TextArea />,
document.getElementById("react")
);
<div id="react"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
【问题讨论】:
-
您的值基于状态,但只会以去抖动的方式更新...这对您有用吗?为什么需要去抖动?
-
如上所述,我有一个
preview div,如果在textarea中有一个长按键或类似 100 多个字符,则由于不断的重新渲染,反应开始变得迟钝。是的,在给定的去抖时间警告出现后,去抖只工作一次。对无效值做出反应警告:This synthetic event is reused for performance reasons. If you're seeing this, you're accessing the property target on a released/nullified synthetic event. This is set to null. If you must keep the original synthetic event around, use event.persist(). -
我在处理 redux 周期时遇到了延迟。在组件的本地状态上,我还没有看到这种情况发生......你能在小提琴中重现吗?
-
嗯,确实是一样的。预计当地会出现类似情况。好吧,那么显然它与 redux 循环有关。首先猜测这是由于对道具的不断映射状态和对道具的不断分派,所以也许我可以将映射状态反跳到道具:o
-
我建议重新考虑架构,也许您不需要 redux 商店中的价值?
标签: javascript reactjs redux lodash