gpt4 book ai didi

reactjs - 如何在 React/Redux 中对 transient 事件进行建模?

转载 作者:行者123 更新时间:2023-12-03 13:24:53 25 4
gpt4 key购买 nike

虽然 React 和 Redux 非常适合对 UI 状态进行建模,但有时会出现某些情况发生,UI 需要以离散的过程方式处理该事件,而这是没有意义的将 transient 事件视为会持续任何时间段的状态。

两个示例,来自类似 JS Bin 的代码编辑器应用程序:

  • 用户将其代码导出到 GitHub gist。导出完成后,我们要打开一个新的浏览器窗口来显示要点。因此,React 组件层次结构需要知道要点的 ID,但仅在某个时刻,此时它将打开窗口并完全停止关心要点导出。
  • 用户单击错误消息,这会导致编辑器将发生错误的行置于编辑器中的焦点中。同样,UI 只关心某一时刻需要聚焦哪一行,此时(非基于 React 的)编辑器被告知聚焦该行,然后整个事情就被忘记了。

我想出的最不令人满意的解决方案是:

  • 当触发事件发生时,调度一个操作以使用所需信息(要点 ID、要聚焦的行)更新 Redux 状态
  • 对该信息感兴趣的 React 组件将监视生命周期 Hook 中的相应 props(componentWillReceiveProps 等)。当信息出现在其属性中时,它会采取适当的操作(加载要点窗口,将编辑器聚焦在该行上)
  • 然后,该组件立即向 Redux 存储分派(dispatch)另一个事件,实质上是说“我已经处理了这个”。 transient 事件数据将从 Redux 状态中删除。

对于这种情况有更好的模式吗?我认为这幅图的一个基本部分可能是 UI 对操作的响应总是突破 React 组件结构——打开一个新窗口、调用编辑器 API 上的方法等。

最佳答案

你的解决方案肯定可行,但是你提出的这类问题听起来根本不适合用 redux 来处理。对我来说,仅使用简单的 React 并将必要的函数传递给组件听起来更自然。

例如,对于导出情况,与其调度更新某些状态的操作,然后触发新窗口打开,为什么不直接打开新窗口来代替调度该操作呢?如果您拥有调度操作以触发打开窗口所需的信息,您应该能够在同一位置打开窗口。

对于单击错误消息触发调用非 React、命令式 api 的示例,请从错误消息和编辑器的最近公共(public)父级传递一个函数。父级还可以维护对编辑器周围包装器的引用。即使它有多深,如果你 pass down a function to set the ref 获得你想要的引用也不错。 。因此,从父级传递到错误消息组件的函数可以简单地调用它维护到编辑器的引用上的方法。基本上是这样的:

class Parent extends Component {
constructor(...args) {
super(...args)

this.onErrorMessageClick = this.onErrorMessageClick.bind(this)
}

onErrorMessageClick(lineNumber) {
if (this.editor) {
this.editor.focusOnLine(lineNumber)
}
}

render() {
return (
<div>
<ErrorMessage onClick={ this.onErrorMessageClick } lineNumber={ 1 } />
<ErrorMessage onClick={ this.onErrorMessageClick } lineNumber={ 2 } />
<EditorWrapper editorRef={ (editor) => { this.editor = editor } } />
</div>
)
}
}

const ErrorMessage = ({ onClick, lineNumber }) => (
<button onClick={ () => onClick(lineNumber) }>
{ `Error Message For ${lineNumber}` }
</button>
)

// Just adding EditorWrapper because your editor and error messages probably aren't right next to each other
const EditorWrapper = ({ editorRef }) => <Editor ref={ editorRef } />

class Editor extends Component {
focusOnLine(lineNumber) {
// Tell editor to focus on the lineNumber
}

render() {
...
}
}

关于reactjs - 如何在 React/Redux 中对 transient 事件进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43623479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com