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