【问题标题】:When should I put state in parent?我什么时候应该把状态放在父母身上?
【发布时间】:2021-04-02 00:21:20
【问题描述】:

这是我的第一个 StackOverflow 问题,请随时添加您想要的任何建议。

我有一个 AudioControls 组件,它呈现四个不同的 Controls 组件,每个组件用于不同的音频选项(音量、低音、中音、高音)。 我以父母知道并管理四种状态的方式编写它: 使用状态({ 音量:50, 低音:50, 中:50, 高音:50, }) 然后将这些值作为道具传递给孩子。

对此我有两个担忧:

  1. 控件组件完全一样,也许它们可以有自己的值状态(在每个控件上放置一个 audioValue 状态)。我已经读过在可能的情况下总是提升状态是一个很好的做法,但是为什么需要它呢?这样做的充分理由是什么?

  2. 鉴于这些控件都非常相似,有没有办法将地图功能与这些控件一起使用?当然,不会失去可读性。

这是音频控制代码:

function AudioControls() {
const [audioValues, setAudioValues] = useState({
    volume: 50,
    bass: 50,
    mid: 50,
    treble: 50
})

function handleControl(option, id) {
    const oldValue = audioValues[id]
    const newValue = option === "+" ? oldValue + 1 : oldValue - 1
    
    setAudioValues(prevState => (
        {
            ...prevState,
            [`${id}`] : newValue
        }
    ))
}

return(
    <>
        <Control
            id="volume"
            name="Volume"
            value={audioValues.volume}
            handleControl={handleControl}
        />
        <Control
            id="bass"
            name="Bass"
            value={audioValues.bass}
            handleControl={handleControl}
        />
        <Control
            id="mid"
            name="Mid"
            value={audioValues.mid}
            handleControl={handleControl}
        />
        <Control
            id="treble"
            name="Treble"
            value={audioValues.treble}
            handleControl={handleControl}
        />
    </>
   )
}

这里是控制组件:

function Control({ id, name, value, handleControl }) {
    return(
        <div>
            <button onClick={() => handleControl("+", id)}>
                +
            </button>
            <label>{name}: {value}</label>
            <button onClick={() => handleControl("-", id)}>
                -
            </button>
        </div>
    )
}

【问题讨论】:

    标签: javascript reactjs refactoring


    【解决方案1】:

    这是我的第二个堆栈溢出答案。也欢迎任何和所有反馈。

    我很想知道您从哪里听说过解除状态总是一个好主意。我对此的想法是:如果提升状态总是一个好主意,那么你什么时候停止提升?为什么在这种情况下只将状态提升一个?为什么不进一步提升它?

    回答您的第一个问题:将状态提升到父组件的主要原因是您是否需要两个同级组件来使用相同的状态。例如:

    const [volume, setVolume] = setState(50);
    
    function changeVolume (newVolume) {
      setVolume(newVolume);
    }
    
    <VolumeDisplay volume={volume} />
    <VolumeControl onChange={changeVolume} />
    

    在您的情况下,看起来每个人都能够更改自己的状态,因此最好将状态下推到每个&lt;Control&gt;。将音频值本地放入控件组件后,您可以像这样轻松地映射它们:

    const controls = [
      {id: "bass", name: "Bass"},
      {id: "volume", name: "Volume"},
      {id: "mid", name: "Mid"},
      {id: "treble", name: "Treble"},
    ]
    
    return (
      <>
        {controls.map(({id, name}) => <Control id={id} name={name} />)}
      <>
    )
    

    【讨论】:

    • 谢谢!这样代码看起来更干净。我正在使用一本名为“Pure React”的书学习 React,并且在某些时候,它说保持组件无状态总是更好,这样它们更容易维护。它使用侧边栏的示例,并声称如果需要隐藏它,则应提升显示/隐藏状态,因此它在内部不知道它是否可见并且只是被渲染(优点是如果你'有多个侧边栏,例如,需要将它们的状态保存在本地存储中,您不需要其他方法来区分它们)。但我可能把它混在一起了:/
    猜你喜欢
    • 2017-12-17
    • 2014-05-05
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2021-09-18
    相关资源
    最近更新 更多