javascript - React : Click text,动态附加表单并用它来重命名文本

标签 javascript reactjs

我想知道如何使用 React.js 编写执行以下操作的代码 我画了一个 JQuery 示例来演示我想要的内容:

http://jsfiddle.net/k3j7u6zv/

let form = " <form class='update-name'> <input type='text' class='room-new-name'> <input type='submit'> </form>"

$(".room-name").on("click",function(){
     let parent = $(this).parent()
     parent.append(form)
})


$(".room").on("submit",function(event){
    event.preventDefault()


     let newName = $(".room-new-name").val()
     $(".room-name").text(newName)
     $(".room > .update-name").remove()

})

React 代码......(不完全确定如何使用 React 来思考这个问题)

class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      rooms:[{name:"coffee talk"},{name:"cooking"},{name:"skateboarding"},{name:"coding"}]

    }

  }

  changeName(){
    // ?
  }

  render() {

      let roomList = this.state.rooms.map((val,index)=>{
                       return <li key={index}>{val.name}</li> 
      })

    return (
         <div>
            <ul>
              {roomList}
            </ul>  
         </div>
    );
  }
}

ReactDOM.render(
    <div>
      <App/>
    </div>,
    document.getElementById('root')
)

最佳答案

我想我已经弄清楚了这一点,但我不确定这是否是“最佳实践”或接近它。

http://jsfiddle.net/od6ces0a/1/

class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      rooms:[{name:"coffee talk"},{name:"cooking"},{name:"skateboarding"},{name:"coding"}],
      roomCSS:{display:"none"},
      selectedRoomIndex:undefined,
      tempName:"",

    }

  }

  setRoomIndex=(roomID)=>{
    console.log(roomID);
     this.setState({
          selectedRoomIndex:roomID,
          roomCSS:{display:"block"}
     })
  }


  handleChange=(event)=> {
    this.setState({tempName: event.target.value});
  }


  setNewRoomName=(event)=>{
    event.preventDefault()

    let updatedRoomList = this.state.rooms.map((val,index)=>{
         if(index === this.state.selectedRoomIndex){
           val.name = this.state.tempName;
           return val
         }else{
           return val
         }
    })


    this.setState({
        rooms:updatedRoomList,
        roomCSS:{display:"none"},
        tempName:""
    })
  }


  render() {


      let roomList = this.state.rooms.map((val,index)=>{
                       return <li onClick = {()=>this.setRoomIndex(index)} key={index}>
                                 <span>{val.name}</span>
                               </li> 
      });

    return (
         <div>
            <ul>
               <form onSubmit={this.setNewRoomName} className="change-room-name" style={this.state.roomCSS}> 
                 <input type="text" onChange = {this. handleChange} value={this.state.tempName}/> 
                 <input type="submit"/>
               </form>
               {roomList}
            </ul>  
         </div>
    );
  }
}

ReactDOM.render(
    <div>
      <App/>
    </div>,
    document.getElementById('root')
)

关于javascript - React : Click text,动态附加表单并用它来重命名文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51219940/

相关文章:

javascript - 向对象添加军事时间

javascript - 相对于视口(viewport),Intersection Observer 是否从跨域 iframe 内部工作?

Javascript document.getElementById 调试

javascript - 当给定对象时获取对象的 ID

javascript - 最好的表排序器不是 Jquery?

mysql - NodeJS 中的 SQL Promise 返回空括号,但是当在 SQL Workbench 中执行相同的查询时,它返回正确的数据

javascript - 如何从表单组件获取状态/值?

javascript - React router v4 内页(javascript)

javascript - 在协调无向图上计算 A*(A-star) 算法中的 f 成本

javascript - 为什么我应该使用导出的常量设置 redux 操作类型?