【问题标题】:Why aren't the props updating?为什么道具不更新?
【发布时间】:2019-02-26 15:42:21
【问题描述】:

我正在尝试将可拖动属性添加到渲染出来的组件,但是,我不知道在哪里添加它们。因此,它们至少会呈现出来,但在删除项目时,数组不会在 OnDragEnd 上更新。组件:

const Item = props => { 
const finishedButton = <button onClick={props.handleComplete} className="finishedButton">✔</button>

 return (     
    <li className="background" 
        draggable
        onDragStart={props.dragStart}    
        onDragEnd={props.dragEnd}
        >      
      {finishedButton}{props.item}
   </li>

并在 App 中渲染

  <ul  onDragOver={e => this.dragOver(e)}>
     {this.state.items.map((item, i)=> (
      <Item
       data-id={i}
       key={i}
       dragStart={e => this.dragStart(e)}
       dragEnd={e => this.dragEnd(e)}
       item={item.text}
       />
     ))}     
    </ul> 

Codepen:https://codepen.io/Matt-dc/pen/zbYKNv

【问题讨论】:

    标签: reactjs draggable


    【解决方案1】:

    在您的 dragEnd 函数中 this.draggedElem 未定义。因此prevIndex & newIndex 也未定义,这导致data.splice 返回旧状态。

    【讨论】:

    • 在这种情况下设置它们的方法是什么:this.draggedElem = e.target;似乎不起作用...
    【解决方案2】:

    我不确定你的逻辑,但似乎可行

    let placeholder = document.createElement("li");
    placeholder.className = "placeholder";
    
        const Item = props => { 
            const finishedButton = <button onClick={props.handleComplete} className="finishedButton">✔</button>
    
             return (     
                <li className="background" 
                    draggable          
                    onDragStart={props.dragStart}    
                    onDragEnd={props.dragEnd}
                    onDragOver={props.dragOver}
                    >      
                  {finishedButton}{props.item}
                 >
    
               </li>
          );
        }
    
    
        class App extends React.Component { 
    
          constructor(props) {
            super(props);
    
            this.state = {
              items: [
                    {id: 1, text: "clean car", complete: false},
                    {id: 2, text: "wash dog", complete: false},
                    {id: 3, text: "water plants", complete: false},
                    {id: 4, text: "prune shrubs", complete: false},
                    {id: 5, text: "tidy house", complete: false}
              ],
              input: ""
            }
            this.dragStart = this.dragStart.bind(this);
            this.dragOver = this.dragOver.bind(this);
            this.dragEnd = this.dragEnd.bind(this);
            this.handleChange = this.handleChange.bind(this);
            this.handleSubmit = this.handleSubmit.bind(this);
    
          }
    
          handleChange = e => {
            this.setState({
              input: e.target.value
            });
          }
    
          handleSubmit = () => {
            let newItem = {};
              newItem.id = uuid.v4();
              newItem.text = this.state.input;
              newItem.complete = false; 
            let newItems = this.state.items.concat(newItem);
    
            this.setState({
              items: newItems,
    
            });  
            this.setState({input: ''})
          }
    
          handleComplete = e => {
    
    
          }
    
          dragStart = e => {
            this.draggedElem = e.target;
            e.dataTransfer.setData('text/html', this.draggedElem);    
          }
    
          dragOver = e => {
            e.preventDefault();
            //this.draggedElem.style.display = "none";
            if(e.target.className === 'placeholder') return;
            this.newIndex = e.target
          }
    
            dragOverItem = (id,e) => {
            this.to = id;
          }
    
          dragEnd = (from,e) => {
    
            let data = this.state.items;
            let prevIndex = from; 
            let newIndex = this.to;
            console.log(`from ${prevIndex} to ${newIndex}`)
            //if(prevIndex < newIndex) newIndex --;
            data.splice(newIndex, 0, data.splice(prevIndex, 1)[0]);
    
            this.setState({ items: data });
          }
    
          render() {
    
            return(
    
              <div>
    
                <input onChange={this.handleChange} value={this.state.input} />
                <button onClick={this.handleSubmit}>Add item</button>
    
                <ul onDragOver={this.dragOver}>
                 {this.state.items.map((item, i)=> (
                  <Item
                   data-id={i}
                   key={i}
                    dragOver={this.dragOverItem.bind(this,i)}
                   dragStart={e => this.dragStart(e)}
                   dragEnd={this.dragEnd.bind(this, i)}
                   item={item.text}
                   />
                 ))}     
                </ul> 
    
                <p>{this.state.input}</p>
              </div>
    
            );
          }
    
        }
    
    
         ReactDOM.render(<App />, document.getElementById("root"));
    

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 1970-01-01
      • 2018-02-04
      • 2016-12-17
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多