ReactJS:setTimeout在map中不起作用来渲染组件

Thi*_*ebe 2 javascript dictionary settimeout reactjs

我想在一段时间后渲染我的ChatBubble组件.但它不会返回我的组件.相反,它将数字2和3作为字符串返回.

const Conversation = ({data}) => {
  const { messages } = data;

  return (
    <div>
      {
        messages.map(data => {
          return setTimeout(() => {
            return <ChatBubble key={uniqid()} data={data}/>
          }, data.delay);
        })
      }
    </div>
  );
}

export default Conversation;
Run Code Online (Sandbox Code Playgroud)

Jon*_*lms 6

原因setTimeout返回计时器的ID.你不能只是回复一些东西做出反应并期待一些魔法发生.相反,你可能需要像这样的有状态的组合:

class Conversation extends React.Component {
  constructor(props) {
    super(props);
    this.state = { messages: [] };
  }

  render() {
    return this.state.messages.map(data => (<ChatBubble {...data} />));
  }

  componentDidMount() {
     const {messages, delay} = this.props.data;
     this.interval = setInterval(() => {
       this.setState(prev => ({ messages: prev.messages.concat(messages.shift()) }));
       if(!messages.length) clearInterval(this.interval);
     }, delay);
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }
}
Run Code Online (Sandbox Code Playgroud)