2016-04-15 8 views
0

私は反応でtodoアプリケーションを作ろうとしています。しかし、それは二重の投稿を保持します。私は編集機能を作った後、二重の投稿を保持します。私はガイドの例に従ってきました。しかし、私はエラーを見つけることができません。反応コードの二重引用

<!DOCTYPE html> 
    <html> 
    <head> 
    <title>EASY SHIT</title> 
    <meta charset="utf-8"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> 
    <script src="../../build/react.js"></script> 
    <script src="../../build/react-dom.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.min.js"></script> 
    <style> 
     body{ 
     margin-top:30px; 
     } 

     a.delete{ 
      color: red; 
     } 
     </style> 
</head> 
    <body> 
    <div class="container"> 
    <div class="row"> 
     <div class="col-md-12"> 
    <div id="app"></div> 
</div> 
</div> 
    </div> 


    <script type="text/babel"> 
     var App = React.createClass({ 
     getInitialState: function(){ 
      return{ 
      text: '', 
      isEdit: 0, 
      todos:[ 
       { 
       id: 1, 
       text: 'meeting at work' 
       }, 
       { 
       id: 2, 
       text: 'Walk the dog' 
       }, 
       { 
       id: 3, 
       text: 'Eat candy' 
       } 
      ] 
      } 
     }, 
      render: function(){ 
      return(
       <div> 
       <TodoForm 
       {...this.state} 
       changeText={this.handleChangeText} 
       onTodoUpdate={this.handleTodoUpdate} 
       onTodoAdd={this.handleTodoAdd} /> 

       <TodoList 
       {...this.state} 
       editTodo={this.handleTodoEdit} 
       deleteTodo={this.handleTodoDelete}/> 

       </div> 

      ) 
      }, 
      handleTodoAdd: function(text){ 
      var newTodo = { 
       id: this.state.todos.length + 1, 
       text: text 
      } 

      this.setState({todos: this.state.todos.concat(newTodo)}); 

      }, 

      handleTodoDelete: function(todo){ 
      var todos = this.state.todos; 
      for(var i = 0;i <todos.length; i++) { 
       if(todos[i].id == todo.id){ 
       todos.splice(i, 1); 
       } 
      } 

      this.setState({todos: todos}); 

      }, 


      handleTodoEdit: function(todo){ 
      this.setState({ 
       text: todo.text, 
       isEdit: todo.id 
      }); 

      }, 

      handleChangeText: function(text){ 
      this.setState({text: text}); 
      }, 

      handleTodoUpdate: function(todo){ 
      var todos = this.state.todos; 
      for(var i = 0;i <todos.length; i++) { 
       if(todos[i].id == todo.id){ 
       todos.splice(i, 1); 
       } 
      } 
      todos.push(todo); 
      this.setState({todos: todos}); 

      } 

     }); 

     var TodoForm = React.createClass({ 
      render: function(){ 
      return(
       <div> 
      <form onSubmit={this.onSubmit}> 
       <div className="form-group"> 
       <label>Todo text</label> 
       <input type="text" ref="text" value={this.props.text} onChange={this.onChange} className="form-control" /> 

       </div> 
      </form> 
       </div> 

      ) 
      }, 

      onChange: function(e){ 
      this.props.changeText(e.target.value); 
      }, 

      onSubmit: function(e){ 
      e.preventDefault(); 
      var text = this.refs.text.value.trim(); 

      if(!text){ 
       alert('Please enter something'); 
       return; 
      } 

      if(this.props.isEdit){ 
       var updatedTodo = { 
       id:this.props.isEdit, 
       text: text 

       } 

       this.props.onTodoUpdate(updatedTodo); 
      } else { 
       this.props.onTodoAdd(text); 
      } 

      this.props.onTodoAdd(text); 
      this.refs.text.value= ''; 

      } 

     }); 


     var TodoList = React.createClass({ 
      render: function(){ 
      return(
       <ul className="list-group"> 
      { 
       this.props.todos.map(todo => { 
       return <li className="list-group-item" todo={todo} key ={todo.id}> 
       <span onClick={this.editTodo.bind(this, todo)}> {todo.text}</span> <a onClick={this.OnDelete.bind(this, todo)}className="delete" href="#">x</a></li> 
       }) 
      } 
       </ul> 

      ) 
      }, 

      OnDelete: function(todo){ 
      this.props.deleteTodo(todo); 
      }, 

      editTodo: function(todo){ 
      this.props.editTodo(todo); 
      } 

     }); 
     ReactDOM.render(
     <App />, 
     document.getElementById('app') 
    ); 
    </script> 
    </body> 
</html> 
+0

'onSubmit'で' this.props.onTodoAdd'を2回行うことができます... – azium

答えて

1

既存のアイテムを編集しているのか、新しいアイテムを追加しているのかを追跡していないようです。

編集している場合は、編集しているものを追跡し、置き換えたり、状態で更新したり、リストに追加したりする必要があります。あなたはちょうど追加しているので、あなたのアプリは常に新しいものが追加されていると思っているのでダブルポストのように見えますが、実際には更新されたテキストを持っている新しいアイテムを追加しています。

もう1つの方法は、deleteとeditを呼び出すことです。これは同じ効果があります。

関連する問題