我在一个套牌构建网站上这样做。您可以选择两个选项,这取决于您是否要使用 Redux。
无论你选择哪个方向,解决方案都是相似的。唯一改变的是逻辑在哪里。使用 redux,它将在减速器中。没有它,逻辑将在您的组件中。我个人喜欢使用 redux,因为如果您的 UI 发生变化,您不必再纠结以使您的网站再次运行,并且由于 useSelector 钩子可用于轻松提取父组件和子组件中的 redux 值,它可以将组件与子组件分离不会污染您的道具或构建上下文提供程序。
您将需要一个点击离开的侦听器组件,例如 https://www.npmjs.com/package/react-click-away-listener。
没有redux:
import * as React from 'react'
import ClickAwayListener from 'react-click-away-listener'
const MyComponent = (props) => {
const [isEditingField, setIsEditingField] = React.useState(false)
const [value, setValue] = React.useState('')
const handleClick = (event) => {
setIsEditingField(true)
}
const handleClickAway = (event) => {
setIsEditingField(false)
}
return <div>
{editing && <ClickAwayListener>
<input
type="text"
onChange={setValue}
onClick={handleOnClick}
/>
</ClickAwayListener>
</div>}
{!editing && <p>
{value}
</p>}
}
请记住,您可能会使用如下所示的某种钩子来消除输入的抖动。这会在用户每次输入输入时阻止输入执行 Web 请求。
import * as React from 'react'
export const useDebounce = (
value,
setValue,
timeout = 100,
) => {
React.useEffect(() => {
const timeoutId = setTimeout(() => setValue(), timeout)
return () => clearTimeout(timeoutId)
}, [value])
}
您还需要研究 React 中的短路条件渲染。这是当您在该组件的返回值中执行上述技术时。即{booleanValue && <JSX /> 或{!booleanValue && <JSX />}。在 React 中拥有非常干净的渲染代码是一种很好的方式。
如果你决定使用 redux,你需要做的远不止这些。