如何更改 React 地图中的渲染顺序

Posted

技术标签:

【中文标题】如何更改 React 地图中的渲染顺序【英文标题】:How to change order of rendering in a React map 【发布时间】:2020-06-23 14:57:36 【问题描述】:

我有一个简单的任务,我觉得这个问题的答案也很简单。但由于某种原因,我无法绕过它。我应该从数据库中获取问题列表并将其显示在网站上。此特定部分是是或否问题。当我从数据库中获取问题时,大多数问题已经按顺序排列,“是”然后是“否”。但是,有一个被翻转了。所以我的问题是,如何将反转的顺序翻转到正确的顺序?

老实说,我没有尝试太多,因为就像我说的那样,出于某种原因,我无法理解它。但我确实知道,在数据库中,问题有一个名为 order 的字段,其中 yes 为 0,no 为 1。所以我猜我必须以某种方式使用它。

这是我呈现问题的代码,

state.surveyQuestions.map(question => (
    <span key=question.question.id>
        <FormLabel className=classes.label component="legend">question.question.label</FormLabel>
        <RadioGroup value=state.consent onChange=handleChange style= height: 'auto', padding: '10px' >
            question.question.choices.items.map(choice => (
                <FormControlLabel key=choice.order style= paddingTop: '1px'  value=choice.value control=<Radio /> label=choice.label />
            ))
        </RadioGroup>
    </span>
))

这是来自数据库的内容,

"choices": 
    "items": [
        
            "label": "No",
            "value": "\"value\":\"0\"",
            "dataUID": null,
            "description": "No",
            "order": 1,
            "goto": null
        ,
        
            "label": "Yes",
            "value": "\"value\":\"1\"",
            "dataUID": null,
            "description": "Yes",
            "order": 0,
            "goto": null
        
    ]

【问题讨论】:

【参考方案1】:

使用Array.protoype.sort() 通过自定义函数对“选择”进行排序;

const data = [
    
        "label": "No",
        "value": "\"value\":\"0\"",
        "dataUID": null,
        "description": "No",
        "order": 1,
        "goto": null
    ,
    
        "label": "Yes",
        "value": "\"value\":\"1\"",
        "dataUID": null,
        "description": "Yes",
        "order": 0,
        "goto": null
    
];

// Full function for readability
function orderByOrderValue( a, b ) 
  if ( a.order < b.order )
    return -1;
  
  if ( a.order > b.order )
    return 1;
  
  return 0;


console.log(data.sort(orderByOrderValue));

// Or use the one-liner
// data.sort((a,b) => (a.id > b.id) ? 1 : ((b.id > a.id) ? -1 : 0)); 

【讨论】:

啊完美。正是我所需要的,非常有意义,谢谢。【参考方案2】:

您可以在呈现选项时使用选项的order 属性进行排序,即choices.items

【讨论】:

【参考方案3】:

您可以轻松实现sort 函数:

data.sort((a, b) => a.order - b.order);

如果 compareFunction(a, b) 返回小于 0,则将 a 排序到低于 b 的索引(即 a 排在第一位)。

如果 compareFunction(a, b) 返回 0,则保持 a 和 b 相对于彼此不变,但相对于所有不同的排序 元素。注意:ECMAscript 标准不保证这一点 行为,因此,并非所有浏览器(例如可追溯的 Mozilla 版本 至少到 2003 年)尊重这一点。

如果 compareFunction(a, b) 返回大于 0,则将 b 排序到低于 a 的索引(即 b 排在第一位)。

按照这些规则,如果您将第一个出现的元素的顺序与以下元素相减,您将得到排序函数的正确输出。

【讨论】:

以上是关于如何更改 React 地图中的渲染顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 for 循环在 React 中的地图上渲染标记?

自定义 React Router 渲染顺序

我可以保证 React 组件数组的渲染顺序吗?

React:给定一个数组,以相反的顺序有效地渲染元素

反应数组的对象更改顺序的更改值

规定动态渲染表React.js的顺序