Javascript React中的排序
我有多个动态出现的元素,标记如下:Javascript React中的排序,javascript,reactjs,sorting,Javascript,Reactjs,Sorting,我有多个动态出现的元素,标记如下: <li> <div> <input type="radio" value="abc" name="abc"> <span>ABC</span> </div> </li> <li> <div> <input type="radio" value="bcd" name="bcd"&
<li>
<div>
<input type="radio" value="abc" name="abc">
<span>ABC</span>
</div>
</li>
<li>
<div>
<input type="radio" value="bcd" name="bcd">
<span>BCD</span>
</div>
</li>
constructor(props) {
super(props);
state = {
data: [ { name: 'abc', type: 'foo' }, { name: 'bcd', type: 'bar' }, ...],
sortAscending: true
}
this.sortList = this.sortList.bind(this);
}
sortList() {
let newData = this.state.data.sort((objectA, objectB) => {
if (this.state.sortAscending) {
return objectA.name - objectB.name;
} else {
return objectB.name - objectA.name;
}
this.setState({
sortAscending: !this.state.sortAscending,
data: newData
}
render() {
<button onClick={ this.sortList }>Sort</button>
}
基础知识
卡介苗
我需要的是在react中对这些元素进行排序?这里最好的方法是什么?对值、名称或范围内容进行排序以及如何进行排序
目前我正在映射它们:
const RadioButtonComponent = ({question, setAnswer, answer, lang}) => {
const radioSingleElement = question.options.map((opt) => {
return <li onClick={() => setAnswer(option.value)}>
<Radio className="r-buttons" value={opt.value}} /><span>{question.useKeysForLabels ? lang[opt.label] : opt.label}</span>
</li>
});
return (
<RadioGroup name={question.name} selectedValue={answer} onChange={(value) => {setAnswer(value);}>
<ul>
{radioSingleElement}
</ul>
</RadioGroup>
)
}
const RadioButtonComponent=({question,setAnswer,answer,lang})=>{
const radioSingleElement=question.options.map((opt)=>{
returnsetAnswer(option.value)}>
{question.useKeysForLabels?lang[opt.label]:opt.label}
});
返回(
{setAnswer(value);}>
{radioSingleElement}
)
}
简单地和您的选项
数组
const RadioButtonComponent = ({question, setAnswer, answer, lang}) =>
<RadioGroup
name={question.name}
selectedValue={answer}
onChange={value => setAnswer(value)}
>
<ul>
{options
.sort((opt1, opt2) => opt1.label > opt2.label) // order options alphabetically by label
.map(option =>
<li key={option.value} onClick={() => setAnswer(option.value)}>
<Radio
className="r-buttons"
value={opt.value}
/>
<span>{question.useKeysForLabels ? lang[opt.label] : opt.label}</span>
</li>
)
}
</ul>
</RadioGroup>
const RadioButtonComponent=({question,setAnswer,answer,lang})=>
设置答案(值)}
>
{选项
.sort((opt1,opt2)=>opt1.label>opt2.label)//按标签字母顺序排列选项
.map(选项=>
- setAnswer(option.value)}>
{question.useKeysForLabels?lang[opt.label]:opt.label}
)
}
简单地和您的选项
数组
const RadioButtonComponent = ({question, setAnswer, answer, lang}) =>
<RadioGroup
name={question.name}
selectedValue={answer}
onChange={value => setAnswer(value)}
>
<ul>
{options
.sort((opt1, opt2) => opt1.label > opt2.label) // order options alphabetically by label
.map(option =>
<li key={option.value} onClick={() => setAnswer(option.value)}>
<Radio
className="r-buttons"
value={opt.value}
/>
<span>{question.useKeysForLabels ? lang[opt.label] : opt.label}</span>
</li>
)
}
</ul>
</RadioGroup>
const RadioButtonComponent=({question,setAnswer,answer,lang})=>
设置答案(值)}
>
{选项
.sort((opt1,opt2)=>opt1.label>opt2.label)//按标签字母顺序排列选项
.map(选项=>
- setAnswer(option.value)}>
{question.useKeysForLabels?lang[opt.label]:opt.label}
)
}
有几种方法可以处理此问题,但最好的方法是对从中获取数据的数组进行排序。我假设您希望用户能够按升序/降序对数据进行排序。因此,您将有一个如下所示的数据数组:
<li>
<div>
<input type="radio" value="abc" name="abc">
<span>ABC</span>
</div>
</li>
<li>
<div>
<input type="radio" value="bcd" name="bcd">
<span>BCD</span>
</div>
</li>
constructor(props) {
super(props);
state = {
data: [ { name: 'abc', type: 'foo' }, { name: 'bcd', type: 'bar' }, ...],
sortAscending: true
}
this.sortList = this.sortList.bind(this);
}
sortList() {
let newData = this.state.data.sort((objectA, objectB) => {
if (this.state.sortAscending) {
return objectA.name - objectB.name;
} else {
return objectB.name - objectA.name;
}
this.setState({
sortAscending: !this.state.sortAscending,
data: newData
}
render() {
<button onClick={ this.sortList }>Sort</button>
}
构造函数(道具){
超级(道具);
状态={
数据:[{name:'abc',type:'foo'},{name:'bcd',type:'bar'},…],
排序:对
}
this.sortList=this.sortList.bind(this);
}
sortList(){
让newData=this.state.data.sort((objectA,objectB)=>{
if(this.state.sortAscending){
返回objectA.name-objectB.name;
}否则{
返回objectB.name-objectA.name;
}
这是我的国家({
sortAscending:!this.state.sortAscending,
数据:新数据
}
render(){
分类
}
我没有尝试过,但我认为如果我犯了几个错误,您应该能够让它正常工作。如果您有任何问题,请告诉我。有几种方法可以处理此问题,但最好的方法是对从中获取数据的数组进行排序。我假设您希望用户能够以升序/降序的方式对数据进行排序按顺序排列。因此,您将有一个如下所示的数据数组:
<li>
<div>
<input type="radio" value="abc" name="abc">
<span>ABC</span>
</div>
</li>
<li>
<div>
<input type="radio" value="bcd" name="bcd">
<span>BCD</span>
</div>
</li>
constructor(props) {
super(props);
state = {
data: [ { name: 'abc', type: 'foo' }, { name: 'bcd', type: 'bar' }, ...],
sortAscending: true
}
this.sortList = this.sortList.bind(this);
}
sortList() {
let newData = this.state.data.sort((objectA, objectB) => {
if (this.state.sortAscending) {
return objectA.name - objectB.name;
} else {
return objectB.name - objectA.name;
}
this.setState({
sortAscending: !this.state.sortAscending,
data: newData
}
render() {
<button onClick={ this.sortList }>Sort</button>
}
构造函数(道具){
超级(道具);
状态={
数据:[{name:'abc',type:'foo'},{name:'bcd',type:'bar'},…],
排序:对
}
this.sortList=this.sortList.bind(this);
}
sortList(){
让newData=this.state.data.sort((objectA,objectB)=>{
if(this.state.sortAscending){
返回objectA.name-objectB.name;
}否则{
返回objectB.name-objectA.name;
}
这是我的国家({
sortAscending:!this.state.sortAscending,
数据:新数据
}
render(){
分类
}
我没有尝试过,但我认为如果我犯了几个错误,你应该能够让它起作用。如果你有任何问题,请告诉我。这完全取决于你想按什么排序。我假设你想按
值排序,尽管这是个人意见,询问这些问题对St来说是不合适的ackOverflow。你说它是动态出现的,所以我假设你通过映射数组来呈现这个html?我的建议是通过javascript对数组进行排序,然后使用.map函数呈现数组。有很多方法可以对元素进行排序。你可以对其值进行排序,然后使用纯JavaScri的有序值呈现html内容pt
。请看这个问题:。这完全取决于您想按什么对它们进行排序。我假设您想按
值对它们进行排序,尽管这是一个个人意见,但对于StackOverflow来说,询问这些内容将是离题的。您说这是动态的,所以我假设您通过映射数组来呈现此html?我的建议n是通过javascript对数组进行排序,然后使用.map函数呈现数组。有许多方法可以对元素进行排序。您可以对其值进行排序,然后使用纯javascript
的有序值呈现HTML内容。请参见此问题:。您能再看一看我的问题吗?我添加了如何映射它们。@Camila我保留我的解释更新。现在刚适应你的代码:)你能再看看我的问题吗?我添加了如何映射它们。@卡米拉我保留我的解释。现在刚适应你的代码:)我添加了整个内容,所以你能再看一看我是如何映射的,以及如何在其中包含排序吗?我有点不清楚你想要的是什么,如果你要问的是如何在映射之前对项目进行排序,那么只需像这样排序:options=question.options.sort((a,b)=>{return b-a;});然后是options.map,就像您所做的那样。您的问题.options数组只是一个常规数组,因此您可以像其他数组一样排序。每当它呈现该组件时,它都会进行排序,我希望它只呈现一次。然后我建议您在服务器端对数据进行排序,因为我认为您在这里没有选项。您接收数据,它呈现,它呈现n排序,然后使用新的状态信息重新渲染。据我所知,解决此问题的唯一方法是在服务器端排序,然后发送预排序的数据。谢谢。我感谢您的重播!我添加了全部内容,因此您可以再看一看我是如何映射的以及我是如何