使用ReactJS更改列表中项目的顺序

时间:2020-03-24 05:04:33

标签: javascript arrays reactjs sorting material-ui

我已经使用材质UI和reactjs创建了一个列表,当一个新元素添加到列表中时,新元素将位于列表顶部。 我有一个要求,当我单击列表中的某个元素时,该元素应该是删除线,并且现在该元素应列在列表的底部。 单击后可以删除元素,但对于如何将元素置于列表底部感到困惑

我应该如何解决这个问题?

此处显示了listlayout.js的代码,在此代码中,列出了添加的项,我需要找到一种方法来敲击元素时更改列表顺序的方法

app.js

    class App extends Component {

    constructor(props) {
        super(props);
        this.state={
            items:[],
            newItem:{
                id:'',
                itemText:''
            },
            updateItem:false
        };
        this.handleInput = this.handleInput.bind(this);
        this.addItem = this.addItem.bind(this);
    }

handleInput = e =>{
        this.setState({
            newItem:{
                id:1 + Math.random(),
                itemText: e.target.value

            }
        });

};

    addItem = e =>{
        e.preventDefault();
         const typedItem = this.state.newItem;

        if(typedItem.itemText !==""){
            const typedItems=[...this.state.items,typedItem];
            this.setState({
                items:typedItems,
                newItem:{
                    id:'',
                    itemText: ''
                },
                updateItem:false
            })
        }
    };




    render() {
        return (
            <div >

                <HeaderBar/>


                             <ListLayout items={this.state.items}

                                        />


            </div>



        );
    }
}

export default App;

ListLayout.js

const ToDoList = props => {
  const clearList = props.clearList;
  const deleteItem = props.deleteItem;
  const updateItem = props.updateItem;
  const strikeList = props.strikeList;

  const listItems = item => {
    return <div key={item.id}>{item.itemText}</div>;
  };

  const completed = id => {
    document.getElementById(id).style.textDecoration = "line-through";
    return true;
  };

  const strikeTextMethod = id => {
    completed(id);
  };

  return (
    <div>
      <Grid container justify="center" alignContent="center">
        <Grid item xs={12} md={6}>
          <Typography variant="h6" className={classes.title}>
            To do List
          </Typography>

          <div className={classes.demo}>
            <List dense={dense}>
              {items
                .slice(0)
                .reverse()
                .map(x => (
                  <ListItem
                    key={x.id}
                    button
                    id={x.id}
                    onClick={() => strikeTextMethod(x.id)}
                    divider
                  >
                    <ListItemText primary={listItems(x)} />
                    <ListItemSecondaryAction></ListItemSecondaryAction>
                  </ListItem>
                ))}
            </List>
          </div>
        </Grid>
      </Grid>

      <br />
    </div>
  );
};

export default ToDoList;

2 个答案:

答案 0 :(得分:1)

您必须为数组中的每个项目维护strike事件。您可以向数组项添加其他属性,例如isStrikedstatus ..类似的东西。

然后您可以对它们进行相应的排序。.

答案 1 :(得分:0)

您的代码似乎不是完整的解决方案。我没有以项目的定义为例。

但是类似的方法可能是一种解决方法。

     const ToDoList = props => {

        const [items, setItems] = React.useState(props.items || []); // Initial values

        // Maybe you need to these lines to sync the items state.
        React.useEffect(
            () => {
                setItems(items)
            },
            [props.items]
        )

      const completed = id => {
        document.getElementById(id).style.textDecoration = "line-through";
        return true;
      };



      const strikeTextMethod = id => {
        const index = items.findIndex(x => x.id === id);
        const newItems = [items[index], ...items.slice(0, index - 1), ...items.slice(index + 1)]
        setItems(newItems);
        completed(id);
      };
      return (

     )

}