javascript - React js - 创建待办事项列表时遇到问题

标签 javascript reactjs

我正在尝试创建一个待办事项列表,在您完成一项任务后,
只有这样才能启用下一个任务(勾选完成)。

这是我目前所拥有的:

/** @jsx React.DOM */
$(function(){
var tasks = [
  {title: "Wake up"},
  {title: "Eat dinner"},
  {title: "Go to sleep"}
];
var Task = React.createClass({
    getInitialState: function(){
        return {locked:true, done:false}  
    },
    handleClick: function(e){
        this.setState({done: !this.state.done});  
        var selector = '.toggle[data-order="'+(this.props.order+1)+'"]';
        this.setState({locked: true})
        console.log(selector)
        console.log($(selector).removeAttr("disabled"))

    },
    render: function() {

      var locked;
      //Fix first task to not be disabled
      if(this.props.order == 0 && this.state.done === false)
        locked = false;
      else
        locked = this.state.locked;
      var done = this.state.done ? "Done":"Not done";
      var classView = "task" + (this.state.done ? " done":" not-done");
      return (
          <div class="todo well well-sm" class={classView}>
            <span class="description">{this.props.title}</span>
            <button type="button" onClick={this.handleClick} data-order={this.props.order} disabled={locked} class="toggle btn btn-default btn-xs pull-right">
              <span class="glyphicon glyphicon-unchecked"></span>&nbsp;Done
            </button>
          </div>
      );
    }
});
var TaskList = React.createClass({
  render: function(){
    var i = -1;
    var taskNodes = this.props.data.map(function (task) {
      return <Task title={task.title} order={++i} />;
    });
    return (
      <div class="task-list">
       {taskNodes}
      </div>
    );
  }
});
var Guider = React.createClass({
  render: function(){
    return (
      <div>
        <TaskList data={this.props.data} />
      </div>
    );
  }
});
React.renderComponent(<Guider data={tasks} />, document.body);
});

next按钮还是没有禁用,总感觉自己做错了(不符合react“zen”)。

顺便说一句: 如何在用户不触发的情况下更改 dom 元素的状态?有什么我应该使用的 ID 吗?

最佳答案

如果将数据初始化到非根组件,则很难更新其他组件。所以我更喜欢将数据保存在根组件中,然后将点击处理程序作为 Prop 传递。现在您可以访问非根组件内的处理程序。调用它将更新根组件和其他非根组件。

这是有效的 jsFiddle - http://jsfiddle.net/ammit/wBYHY/5/

例子-

var Task = React.createClass({
  handleClick: function (e) {
    // Passing order of task
    this.props.clicked(order);
  },
  render: function () {
    return ( <button type="button" onClick={this.handleClick}></button> );
  }
});


var TaskList = React.createClass({
  getInitialState: function(){
    // initiate tasks here
  },
  whenClicked: function(order){
    // Revise the tasks using `order`
    // Finally do a setState( revised_tasks );
  },
  render: function(){
    return ( <Task clicked={this.whenClicked} /> );
  }
});

关于javascript - React js - 创建待办事项列表时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18427869/

相关文章:

reactjs - 如何将 React 应用程序从 Github 部署到 AWS S3 存储桶并设置环境变量 注意 : I didn't push . github 中的 env 文件

javascript - 如何将当前上下文保存到 Javascript 中的局部变量

Javascript 重复追加 Textarea 值问题

javascript - 从 node.js shell 获取我的操作系统

javascript - 如果您要查找的元素不存在,如何不破坏 Cypress 测试

javascript - 使用 useEffect 上的方法时遇到困难、缺少依赖项和 useCallback 错误?

html - 将 DIV 与绝对定位的子项水平对齐

javascript - 为生产、开发、发布设置单独的变量值

javascript - 如何使用正则表达式在 javascript 中的另一个单词之后提取单词?

javascript - TypeScript - 将动态属性名称传递给子级