react改变state后视图没有改变

使用antd的基本穿梭框链接描述

                         import { Transfer } from 'antd';

const mockData = [];
for (let i = 0; i < 20; i++) {
  mockData.push({
    key: i.toString(),
    title: `content${i + 1}`,
    description: `description of content${i + 1}`,
    disabled: i % 3 < 1,
  });
}

const targetKeys = mockData
        .filter(item => +item.key % 3 > 1)
        .map(item => item.key);

class App extends React.Component {
  state = {
    targetKeys,
    selectedKeys: [],
  }

  handleChange = (nextTargetKeys, direction, moveKeys) => {
    this.setState({ targetKeys: nextTargetKeys });

    console.log('targetKeys: ', targetKeys);
    console.log('direction: ', direction);
    console.log('moveKeys: ', moveKeys);
  }

  handleSelectChange = (sourceSelectedKeys, targetSelectedKeys) => {
    this.setState({ selectedKeys: [...sourceSelectedKeys, ...targetSelectedKeys] });

    console.log('sourceSelectedKeys: ', sourceSelectedKeys);
    console.log('targetSelectedKeys: ', targetSelectedKeys);
  }

  handleScroll = (direction, e) => {
    console.log('direction:', direction);
    console.log('target:', e.target);
  }

  render() {
    const state = this.state;
    return (
    <div>
      <Transfer
        dataSource={mockData}
        titles={['Source', 'Target']}
        targetKeys={state.targetKeys}
        selectedKeys={state.selectedKeys}
        onChange={this.handleChange}
        onSelectChange={this.handleSelectChange}
        onScroll={this.handleScroll}
        render={item => item.title}
      />
      <button onClick={this.sort}>上移一位</button>
      </div>
    );
  }
}

ReactDOM.render(<App />, mountNode);

现在想实现穿梭框右边的某一个item可以上下移动
下面是右边某一个item向上移动的代码

sort=()=>{
        let selectedKeys = this.state.selectedKeys;
        let targetKeys = this.state.targetKeys;
        
        const index = targetKeys.indexOf(selectedKeys[0]);//规定只选一个
        const temp = targetKeys[index - 1]
        targetKeys[index - 1] = targetKeys[index]
       
        this.setState({
            targetKeys: targetKeys
        }, function () {
            console.log("this.state.targetKeys", this.state.targetKeys)
        })
}
        

console.log()打印出来的this.state.targetKeys已经改变,但是视图却没有改变.要左右移动一个item这时候视图才更新。
请问一下该如何解决这个问题

阅读 4.2k
1 个回答

试试改成下面这样:

sort=()=>{
    //  ...
    let targetKeys = [ ...this.state.targetKeys ];
    // ...
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题