【问题标题】:Change component state in loop [duplicate]在循环中更改组件状态[重复]
【发布时间】:2018-11-19 12:17:14
【问题描述】:

我想做类似this site 上的动画菜单(我现在正在考虑导航栏下方自行移动的图像):

我有一个具有 3 个状态的组件,每个状态指示应该显示哪个带有链接的图像。我相信我应该使用setTimeout 来更改组件的状态。我尝试在componentDidMount/componentWillMount 方法中执行此操作,但收到错误:

TypeError:无法读取未定义的属性“为什么”

据我了解,这表明状态未设置?我做错了什么?

export default class Menu extends Component {
  constructor(props) {
    super(props)
    this.state = {
      why: true,
      shop: false,
      workshop: false
    }
  }

  componentWillMount() {
    setInterval(function(){
      if (this.state.why) {
        this.setState({why: false, shop: true, workshop: false})
      }
      else if (this.state.shop) {
        this.setState({why: false, shop: false, workshop: true})
      }
      else if (this.state.workshop) {
        this.setState({why: true, shop: false, workshop: false})
      }
    }, 3000);
  }

  render() {
    return (
      <div>
        { this.state.why && 
          <a href='/'>
            <Image src={horizontal1}
              className='pics'
            />
          </a>
        }
        { this.state.shop && 
          <a href='/'>
            <Image src={horizontal2}
              className='pics'
            />
          </a>
        }
        { this.state.workshops && 
          <a href='/'>
            <Image src={horizontal3}
              className='pics'
            />
          </a>
        }
      </div>
    );
  }
}

【问题讨论】:

  • setInterval(function(){ 更改为setInterval(() =&gt; {this 将是您所期望的。
  • @Tholle 谢谢!现在我明白了。如果您希望添加您的评论作为答案,我可以接受。

标签: javascript reactjs


【解决方案1】:

请使用粗箭头函数访问 setInterval 内的构造函数

setInterval(()=> {
  if (this.state.why) {
    this.setState({why: false, shop: true, workshop: false})
  }
  if (this.state.shop) {
    this.setState({why: false, shop: false, workshop: true})
  }
  if (this.state.workshop) {
    this.setState({why: true, shop: false, workshop: false})
  }
}, 3000);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2019-06-08
    • 2020-03-18
    相关资源
    最近更新 更多