【问题标题】:ReactJS ES6 adding logic to the componentReactJS ES6 向组件添加逻辑
【发布时间】:2017-03-29 22:29:44
【问题描述】:

我有一个聊天功能,我正在尝试在我的 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"
        }
]

【问题讨论】:

  • 你能解释一下你的逻辑吗?您想从 from_id 为 1 的对象中渲染 message_id 文本,然后按什么顺序显示其他聊天消息?

标签: reactjs ecmascript-6 react-jsx jsx


【解决方案1】:

您可以使用您的消息数组来创建一个 JSX 元素数组,这些元素可以在另一个 JSX 表达式中用于渲染。

由于您希望首先出现带有from_id == 1 的消息,您可以使用Array#sort 对消息数组进行排序
(为了避免messages 发生变异,使用@987654322 制作数组的浅表副本@)。

然后您在新返回的数组上调用 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
  };
}

【讨论】:

  • 谢谢!虽然它不打算首先对 from_id 到 === 1 进行排序,但它应该按 message_id 排序
  • 你已经解决了排序部分但是组件中的逻辑不符合我的业务需求
  • 没问题。要对 message_id 进行排序,请修改 .sort 回调返回以下内容:return a.message_id - b.message_id;
  • 您的问题要求一种在 JSX 中显示来自数组的消息列表的方法。我的回答提供了一种方法。想详细说明您的业务需求是什么?
  • 我如何添加在正文中显示它们的逻辑,我有一个 css 类,如果它是 from_id === 1 则使其浮动正确,否则。如果你想象一个简单的聊天,它应该是这样工作的,我已经在我的例子中制作了一个伪代码我只需要将它的语法合并到我的 JSX 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2017-11-13
  • 2021-09-26
  • 2021-06-22
  • 2017-03-13
  • 2015-05-14
相关资源
最近更新 更多