【问题标题】:change button icon on click react单击反应更改按钮图标
【发布时间】:2018-04-13 09:50:37
【问题描述】:

使用 react,我有一个带有图标的按钮,一个字体很棒的按钮。我想在点击图标之间切换:图标是带有标题和布尔值的眼睛。如果布尔值是真的,眼睛应该是睁开的。如果单击相同的按钮,则布尔值变为 false,并且按钮的图标应更改为关闭。 我的按钮已经进行了验证,因此如果布尔值是真或假,它将更改图标,我的问题是更改布尔 onClick。尝试使用 setState 无法这样做。

我的按钮:

   {props.eyes.map(eye => {
                    return (<div className={"column is-2"}>
                        <button
                            className={eye.toggled === 'true' ? "button is-white fa fa-eye" : "button is-white fa fa-eye-slash"}
                            onClick={() => props.pickEye(eye)}/>
                        {eye.tituloEye}
                    </div>)
                })}

我的状态:

state = {

            eyes:
                [
                    {
                        toggled: 'false',
                        tituloEye: 'porta'
                    },
                    {
                        toggled: 'true',
                        tituloEye: 'prateleira'
                    },
                ],

            eyeSelecionado: '',
}

我得到了像这样的点击按钮:

pickEye = (eye) => {
    this.setState({eyeSelecionado: eye});
};

【问题讨论】:

  • 您正在切换您的状态,但您的渲染代码中根本没有使用该状态。既然没有变化,就渲染成一样的。

标签: javascript reactjs button icons


【解决方案1】:

您需要在父状态中设置切换值

    {props.eyes.map((eye, index) => {
        return (<div className={"column is-2"}>
            <button
                className={eye.toggled === true 
                    ? "button is-white fa fa-ye" 
                    : "button is-white fa fa-eye-slash"
                }
                onClick={() => props.pickEye(index)}
            />
                {eye.tituloEye}
            </div>
        )
    }
)}

pickEye = (index) => {
    this.setState(prevState => ({
        var newState = {
            [index]: {
                ...prevState.eyes[index], 
                toggled: !prevState.eyes[index].toggled
            }
        };
        eyes: Object.assign([], prevState.eyes, newState)}));
};

【讨论】:

  • 它在从真到假时工作,但反之则不行。
  • 这是我目前所拥有的,我不知道为什么我在 dom 上没有渲染..https://codesandbox.io/s/5zvpnn92k4
  • 你的数据应该是toggled: false,而不是toggled: "false",,同样你应该比较{eye.toggled === true ?
  • 不用担心,很高兴它有帮助
【解决方案2】:

你的pickEye 不需要是一个监听函数,因为对于onClick={() =&gt; props.pickEye(index)}() =&gt; 这已经是一个内联监听函数。 pickEye 是你的类函数。所以这将是onClick={() =&gt; this.state.pickEye(index)}/&gt; 而不是onClick={() =&gt; props.pickEye(index)}/&gt;

所以,改变:

pickEye = (eye) => {
    this.setState({eyeSelecionado: eye});
}

pickEye(eye) {
    this.setState({eyeSelecionado: eye});
}

然后是你的按钮:

<button className={eye.toggled === 'true' ? "button is-white fa fa-eye" : "button is-white fa fa-eye-slash"}
    onClick={() => this.state.pickEye(index)}/>

【讨论】:

  • 我的按钮在另一个组件中,然后是我的状态,这就是我使用道具的原因。
  • 所以你需要在你的子组件props 中传递你的pickEye。使用this.props 来执行此操作。在您的父组件中:&lt;ChildComponent pickEye ={this.pickEye} /&gt; 在您的子组件中:constructor(){ this.state = { eye: this.props.eye } } componentWillReceiveProps(newProps) { this.setState({ eye : newProps.eye }) }
  • 如果可能的话,我想避免在多个组件中出现状态
  • 你可以,但你的eye 状态需要在你的父母中。当您的父 eye 状态更改时,这将在所有子组件中使用 componentWillReceiveProps 执行更新 eye 道具值。要尊重 React 生命周期,请参阅:reactjs.org/docs/react-component.html#updating
猜你喜欢
  • 2014-02-16
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2023-02-07
  • 2017-01-14
  • 2020-10-03
  • 2017-01-21
相关资源
最近更新 更多