ReactJS ES6 向组件添加逻辑

ReactJS ES6 adding logic to the component

我有一个聊天功能,我正在尝试在我的 JSX 代码中显示一组消息,其中根据对象中的值有条件地呈现 className。

我真的是 ES6 和 React 的新手,我不知道如何在 JSX 中处理这个逻辑。我正在使用 redux 将我的状态映射到道具中。为简洁起见,我将代码简化为最简单的形式。

class ChatWidget extends Component {

  render() {
    return (
      <div className={chat.body}>
        {/* if from_id == 1 */}
        <div className={chat.float-right}>
            <p>  {/* message of from_id==1 */} </p>            
        </div>
        {/* else */}
        <div className={chat.float-left}>
            <p> {/* else message here */} </p>               
        </div>
      </div>
    );
  }
}

function mapStateToProps(state) {
  return {
    messages: state.messages
  };
}

这是我的示例 JSON 数组。

[
        {   
            msg_id: 1,
            to_id: 1,
            from_id: 2,
            message_id: "Marzipan jelly-o croissanty"
        },
        {   
            msg_id: 2,
            to_id: 2,
            from_id: 1,
            message_id: "Jelly sw"
        }
]

您可以使用 messages 数组创建一个 JSX 元素数组,该数组可以在另一个 JSX 表达式中用于渲染。

由于您希望带有 from_id == 1 的消息首先出现,您可以使用 Array#sort to order the messages array
(to avoid mutating messages a shallow copy of the array is made using Array#slice).

然后在新返回的数组上调用 Array#map 以遍历排序的消息,在每次迭代时创建新的 JSX。

代码可能如下所示:

class ChatWidget extends Component {

  render() {
    // deconstruct messages from props
    const {messages} = this.props;

    // Mutating data should be avoided and Array#sort mutates 
    // the array so we use Array#slice to create a 
    // shallow copy before we sort it
    const msgCopy = messages.slice();

    // sort messages so message where from_id === 1 is first
    const sorted = msgCopy.sort((a,b) => {
      return a.from_id - b.from_id;
    });

    // iterate through sorted array to create 
    // an array JSX elements
    sorted.map(message => {
      const {from_id, message_id} = message;

      // Change class if from_id is 1
      const classToAdd = (from_id === 1) ? ('chat.convo + ' ' + chat.them'):('chat.convo');

      return (
        <div className={classToAdd}>
          <div className={chat.text}>
            <p>  { message_id } </p>            
          </div>
        </div>
      );
    });

    // use sorted array as follows to create a div containing
    // a child div for each message
    return
    (
      <div className={chat.body}>
        {sorted}
      </div>
    );
  }
}

function mapStateToProps(state) {
  return {
    messages: state.messages
  };
}