javascript - 听取模型变化的惯用方式

标签 javascript reactjs

我是第一次玩 React,我觉得我真的很喜欢它。我已经实现了(大部分)棋盘游戏 Go到目前为止,我遇到了一些奇怪的事情,我不知道如何以惯用的 React 方式处理。基本上,我有一个模型——棋盘游戏——作为它自己的类实现 Board .它仅公开其构造函数和方法 play(i,j)pass。它处理所有游戏逻辑并适本地更新自己的内部状态。它没有引用与 View /组件相关的任何内容。我有一个名为 BoardView 的 React 组件它维护对 Board 实例的引用。我还有一个名为 AlertView 的组件,它会在适当的时候显示有关游戏状态(非法移动等)的消息。

现在一切正常,我喜欢 Board 类及其 View 之间的关注点分离。但是,我让我的 Board 类将其更改传达给 View 的方式很不寻常,我觉得它与其他 React 代码不一致。基本上,我滥用jQuery's event system允许我触发任意事件,例如 ["update", "atari", "suicide"]。在此方案中,组件有一个调用 Board.play 的 onClick 监听器,它会在 Board 实例上触发 0 到许多事件。 Component 监听 "update" 事件,并调用 this.setState,这将强制它重新 render(),将查看正确描述游戏的状态。 AlertView 监听同一面板实例上的 "atari""suicide" 事件并类似地调用 this.setState,它会触发另一个 render()

我应该删除 jQuery 事件吗?如果是这样,最好的方法是什么?

所有代码都可用here你可以玩这个应用here .

编辑: 为了后代的缘故,这个问题是在提交时提出的 3f600c .

最佳答案

我不确定这是否是惯用的 React,但根据 React 教程,onSubmit 处理程序作为 props 从父级传递给子级。

在您的情况下,这意味着将 onPlay 处理程序从 BoardView 传递到 BoardIntersection,如下所示:

var BoardView = React.createClass({
  getInitialState: function() {
    return {"board": this.props.board}
  },
  playHandler: function(i, j) {
    this.props.board.play(i, j)
  },
  render: function() {
    ...
    intersections.push(BoardIntersection({
      color: this.state.board.board[i][j],
      row: i,
      col: j,
      onPlay: this.playHandler
    }));
    ...
  }
})

BoardIntersection 将根据需要调用onPlay:

var BoardIntersection = React.createClass({
  handleClick: function() {
    this.props.onPlay(this.props.row, this.props.col);
  },
})

关于javascript - 听取模型变化的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20850305/

相关文章:

javascript - 在 Safari 中多次播放 HTML5 音频时出现问题

javascript - react : can you use setState with existing state object?

显示/隐藏 Div 的 JavaScript 链式下拉列表?

javascript - 选择字段时的模态表单清除

reactjs - 如何在 axios 中重定向?

javascript - 在 React 中选择不同的下拉选项时更改路由参数

javascript - 如何将 twilio 集成到 react native for android 中?

javascript - React + Node.js 的项目结构应该是什么?

javascript - 在每个换行符中删除字符后的字符串

javascript - 通过 javascript 访问 OAuth2 token 的正确方法