【问题标题】:react-swipe API & Invariant Violation w/ ReactJSreact-swipe API & Invariant Violation w/ ReactJS
【发布时间】:2015-01-21 00:36:15
【问题描述】:

我收到了一个不变的违规错误。我正在尝试让 react-swipe 处理下一个/上一个 API 调用。

这与nextPanel()中的this.setState()有关,猜你不能在render()中调用setState。不知道如何解决这个问题?

顺便说一句 - 我对 react-swipe 的本地副本进行了更改,试图让 swipe.js API 为 slide() 工作。在此处查看我的更改:http://jsfiddle.net/0o1737ya/

react-swipe页面:https://github.com/jed/react-swipe

另一个问题是为什么在我点击带有onClick() 事件的<div> 之前会调用nextPanel()?我添加了一堆console.log()'s 并注意到发生了这种情况。

var MyPrizesCarousel = React.createClass({
  getInitialState: function() {
    return {
      panelIdx: 0,
      isNext: false
    };
  },

    nextPanel: function(index) {
      newPanelIdx = this.state.panelIdx + 0;

      this.setState( {panelIdx: index} );
      this.setState( {isNext: true} );
    },

   render: function() {
      var swipeOptions = {
        continuous: false
      }

     this.carousel = (
          <Swipe continuous={false} panelIdx={this.state.panelIdx} isNext={this.state.isNext} >
            <div>
              <MyPrizesPane1 nextPanel={this.nextPanel} />
            </div>
            <div>
              <MyPrizeOne />
            </div>
            <div>
              <MyPrizeTwo />
            </div>
          </Swipe>
        );

      return (
         <div>
            <div>{this.carousel}</div>        
         </div>
      );
  } 
});


var MyPrizesPane1 = React.createClass({
  nextPanel: function(index) {
    this.props.nextPanel(index);
  },

   render: function() {
      return (
         <div>
            <div onClick={this.nextPanel(1)}>
              <img  className="menu-button" src="static/images/big-prize.gif" />
            </div>

            <div onClick={this.nextPanel(2)}>
              <img className="menu-button" src="static/images/grand-prize.jpg" />
            </div>           
         </div>
      );
  } 
}); 

注意:我从上面的代码中省略了一些 ReactJS 组件,因为它们很简单,不应该影响修复。

【问题讨论】:

  • 另一个奇怪的事情是,在我根据 JSFiddle jsfiddle.net/0o1737ya 修改的 swipe.js 文件中,我还能够从 render() 以及 this.state.mySwipe.next() 访问 this.swipe.next()。不知道为什么 ReactJS 会让这种情况发生。
  • 更新到上面的评论, this.swipe.next() 在 render() 中使用时是未定义的,除非 this.state.mySwipe() 被设置。但是有什么联系,为什么this.swipe.next()开始工作了,应该和this.state无关。你会想吗?

标签: reactjs


【解决方案1】:

当你说

<div onClick={this.nextPanel(1)}>

您的意思是“获取this.nextPanel(1) 的返回值并将其分配给onClick。”那不是你想要的;相反,您想说“分配对this.nextPanel 的引用,第一个参数预先绑定到1onClick。”你可以这样编码:

<div onClick={this.nextPanel.bind(null, 1)}>

【讨论】:

  • 你不需要 .bind() 我的 onClick 处理程序可以正常工作,请参阅 ReactJS 页面,例如使用 onClick 处理程序:facebook.github.io/react/docs/… 我的问题是如何从这个 Swipe 组件访问 next() :jsfiddle.net/0o1737ya 这样我就可以从 Swipe 的父级调用 next()。
  • 旁注,看起来 react-swipe 只是一个包装器,它仍然通过 swipe.js 进行直接 DOM 操作 这看起来是使用纯 ReactJS 对所有内容实现滑动的更合适的方式:github.com/wearefractal/react-swipeable不过,我仍然想用 react-swipe mods 解决我的问题,这让我很傻。
  • @GiantElk 这不正确。 bind 不是设置 this 的值,而是预绑定第一个参数 (1)。正如您在问题中所写,您是在立即调用该函数,而不是将其作为参考传递。
  • 好的,我现在明白了。这太狡猾了。我认为整个 Swipe 示例很混乱,需要重新编写以支持来自 swipe.js 的完整 API。如果您在此处查看 React 组件:jsfiddle.net/0o1737ya 我只是不确定如何构建它以使 API 正常工作。
  • 我尝试使用statics 公开 中的方法,但无法正常工作,静态未定义:facebook.github.io/react/docs/component-specs.html
猜你喜欢
  • 2020-11-20
  • 2018-12-08
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多