Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React/Redux-向一个组件添加排序或筛选功能_Reactjs_Redux_React Redux - Fatal编程技术网

Reactjs React/Redux-向一个组件添加排序或筛选功能

Reactjs React/Redux-向一个组件添加排序或筛选功能,reactjs,redux,react-redux,Reactjs,Redux,React Redux,我构建了一个react redux应用程序,可以从Rails API获取评论列表——我真的想添加按字母升序/降序排序评论列表的功能,但我不确定从哪里开始 我是否需要添加将此列表排序到状态的方式,然后添加新操作以执行此操作?或者有没有更简单的方法将其添加到显示评论列表的组件中 如果可能的话,我会喜欢精确的代码示例,因为我真的很难理解如何开始这项工作,以及在哪里可以完成这项工作 ./components/reviews/ReviewsList.js import React from 'react'

我构建了一个react redux应用程序,可以从Rails API获取评论列表——我真的想添加按字母升序/降序排序评论列表的功能,但我不确定从哪里开始

我是否需要添加将此列表排序到状态的方式,然后添加新操作以执行此操作?或者有没有更简单的方法将其添加到显示评论列表的组件中

如果可能的话,我会喜欢精确的代码示例,因为我真的很难理解如何开始这项工作,以及在哪里可以完成这项工作

./components/reviews/ReviewsList.js

import React from 'react'
import { connect } from 'react-redux'
import { Link } from 'react-router-dom'

const ReviewList = props => {
  const reviewCards = props.reviews.length > 0 ?
    props.reviews.map(r => (
    <div>
    <br></br>
      <p key={r.id}><Link className="App-link" to={`/app/v1/reviews/${r.id}`}>{r.attributes.title}</Link>
      </p>
    </div>)) :
    null


  return reviewCards
}
const mapStateToProps = state => {
  return {
    reviews: state.reviews.reviews
  }
}

export default connect(mapStateToProps)(ReviewList)

如果您还想看其他代码,请告诉我。

根据您文章的措辞,我假设
props.reviews
包含整个评论列表,而不仅仅是第一页,并且我们不会因为排序而显示不同的子集。如果是这种情况,那么我的建议是保持对redux的排序,并通过本地状态或react路由器在组件本身中处理它

地方政府 这取决于您想要为您的州使用什么格式,因为有多种方法是有意义的

在这里,我们保存一个
字符串
“asc”
“desc”

这里我们保存一个
布尔值
。如果
true
,则顺序为降序;如果
false
,则顺序为升序

const [isDesc, setIsDesc] = useState(false);
如果要支持按属性(而不是
title
)排序,可以使用顺序之外的第二个状态:

const [sortBy, setSortBy] = useState("title");
路由器变量 通过URL查询(类似于
“/app/v1/reviews/?sort=title&order=asc”
)通过react路由器控制排序也是有意义的。您可以在中看到该方法的示例

洛达斯分类 Lodash有
sortBy
reverse
两种方法,可以非常轻松地对审阅对象数组进行排序

const sorted = _.sortBy(props.reviews, 'attributes.title');
const reviews = order === "desc" ? _.reverse(sorted) : sorted;
纯JS排序 如果不需要依赖包,可以将using传递给内置数组排序方法。由于
sort()
会对数组进行变异,因此需要在副本上执行此操作

您可以在
属性.title中的
字符串上使用。在引擎盖下,比较使用一个
数字
,因此我们可以将结果乘以
-1
,以颠倒顺序

const reviews = [...props.reviews].sort( (a, b) => 
  (order === "desc" ? -1 : 1 ) * a.attributes.title.localeCompare(b.attributes.title)
)
与lodash版本相比,该版本更难阅读,但同样简洁

组件代码 我重写了您的
ReviewList
组件,以便它对结果进行排序,并包含一个下拉列表来更改排序顺序。(使用非常愚蠢的虚拟数据)

const ReviewList=(道具)=>{
const[order,setOrder]=useState(“asc”);//可以是“asc”也可以是“desc”
const reviews=[…props.reviews].sort(
(a,b)=>
(顺序=“描述”?-1:1)*
a、 attributes.title.localeCompare(b.attributes.title)
);
返回(
订单:
setOrder(e.currentTarget.value)}
已禁用={reviews.length==0}
>
A-Z
Z-A
{reviews.length==0(
没有找到评论
) : (
    {reviews.map((r)=>(
  • {r.attributes.title}
  • ))}
)} ); };
根据您文章的措辞,我假设
props.reviews
包含整个评论列表,而不仅仅是第一页,并且我们不会因为排序而显示不同的子集。如果是这种情况,那么我的建议是保持对redux的排序,并通过本地状态或react路由器在组件本身中处理它

地方政府 这取决于您想要为您的州使用什么格式,因为有多种方法是有意义的

在这里,我们保存一个
字符串
“asc”
“desc”

这里我们保存一个
布尔值
。如果
true
,则顺序为降序;如果
false
,则顺序为升序

const [isDesc, setIsDesc] = useState(false);
如果要支持按属性(而不是
title
)排序,可以使用顺序之外的第二个状态:

const [sortBy, setSortBy] = useState("title");
路由器变量 通过URL查询(类似于
“/app/v1/reviews/?sort=title&order=asc”
)通过react路由器控制排序也是有意义的。您可以在中看到该方法的示例

洛达斯分类 Lodash有
sortBy
reverse
两种方法,可以非常轻松地对审阅对象数组进行排序

const sorted = _.sortBy(props.reviews, 'attributes.title');
const reviews = order === "desc" ? _.reverse(sorted) : sorted;
纯JS排序 如果不需要依赖包,可以将using传递给内置数组排序方法。由于
sort()
会对数组进行变异,因此需要在副本上执行此操作

您可以在
属性.title中的
字符串上使用。在引擎盖下,比较使用一个
数字
,因此我们可以将结果乘以
-1
,以颠倒顺序

const reviews = [...props.reviews].sort( (a, b) => 
  (order === "desc" ? -1 : 1 ) * a.attributes.title.localeCompare(b.attributes.title)
)
与lodash版本相比,该版本更难阅读,但同样简洁

组件代码 我重写了您的
ReviewList
组件,以便它对结果进行排序,并包含一个下拉列表来更改排序顺序。(使用非常愚蠢的虚拟数据)

const ReviewList=(道具)=>{
const[order,setOrder]=useState(“asc”);//可以是“asc”也可以是“desc”
const reviews=[…props.reviews].sort(
(a,b)=>
(顺序=“描述”?-1:1)*
a、 attributes.title.localeCompare(b.attributes.title)
);
返回(
订单:
setOrder(e.currentTarget.value)}
已禁用={reviews.length==0}
>
A-Z
Z-A
{reviews.length==0(
没有找到评论
) : (
    {reviews.map((r)=>(
  • {r.attributes.title}
  • ))}