contenteditable div插入位置问题与回流,但没有流量

时间:2015-12-09 11:25:06

标签: reactjs contenteditable reactjs-flux caret refluxjs

newby alert

我正在尝试在反应组件层次结构中使用contenteditable div。我希望使用回流而不是助焊剂,因为我喜欢设置动作和存储更好的回流方式(更少的样板,更多功能)。

但是,我遇到了附带onInput处理程序的contenteditable div的问题。我想让我的商店保持最新状态,因此任何发生的onInput都会向商店发送一个动作,更新存储在contenteditable div中的内容的字段。

请参阅以下要点https://gist.github.com/dcnieho/0525f1becf1838616f5d,其中test.js有三种不同的方式来使用外部存储,更改通向顶部组件的setState,并且此状态作为props传递下来。 / p>

使用模式1和3(通量,或非常简单的手动版本),工作正常:当我尽可能快地按键时,插入符号保持原样。当使用模式2(回流)时,插入位置将不时地跳到内容可编辑div的开头。我在我的代码生成的日志中看到的是,进入的道具是在innerHTML通过反应引用访问的DOM内容的后面。这触发了对可信任div的重新渲染,改变了它的内部HTML。

请注意,即使在第92行的shouldComponentUpdate函数和第105行的componentDidUpdate注释掉this answer之后的样式,事情也能正常工作。当它们在模式2中被注释掉时会发生同样的问题,即回流。

因此看起来重新渲染本身并不是一个问题(否则所有方法在评论shouldComponentUpdate时都会有问题),但重新渲染并放置一个不同的innerHTML表示当时的情况进入可信赖的div的DOM会让事情变得混乱。

对此的进一步了解如下。我将消息记录到控制台,指示何时发生感兴趣的事情。使用vanilla flux,bashing键,我得到了一个很好的onInput链,调用了调度程序,渲染列,下一个onInput调用。有了回流,我可以在任何地方获得onInputs,在渲染列车完成之前,或者甚至在调度员(好的,动作/存储它被称为回流)被调用之前的onInput之前。似乎有些事情在回流时异步发生,而我们的用例不应该这样吗?

我做错了吗?反流事件发生的方式不适合我想要的吗?有没有更好的方法来处理react + flux中的内容可编辑div?是否有重要的概念我似乎无法理解(我是新手)?

1 个答案:

答案 0 :(得分:0)

好的,事实证明这是一个RTFM情况:回流让你可以选择让同步或异步触发存储的动作。默认值是异步的。回流操作有trigger(?<=^)0+方法,前者默认调用,但后者可以直接调用或在创建操作时设置为默认值。

动作的同步处理解决了我的问题,不允许DOM超越事件处理。