reactjs - 反应按值排序
问题描述
我收到了一个需要添加功能的 shell 代码。我是这个 shell 中嵌入的 HTML、CSS、React 等的初学者。我有一个 json 文件,其中包含我的票证,其中包括 id、创建时间、标题等。我希望添加一个按钮来按值排序票证,例如创建时间。我已经尝试了许多我见过的格式,但到目前为止都没有工作,这是返回的代码的当前状态:“TypeError:无法读取未定义的属性'sortByDate'”关于toggleSortDate(删除了我认为不相关的部分):
import React from 'react';
import './App.scss';
import {createApiClient, Ticket} from './api';
export type AppState = {
tickets?: Ticket[],
search: string;
}
export class App extends React.PureComponent<{}, AppState> {
state: AppState = {
search: ''
}
sortByDate () {
const {tickets} = this.state;
let ordTickets = tickets
ordTickets = tickets.sort((a, b) => a.creationTime < b.creationTime)
this.setState({
tickets: ordTickets
})
}
toggleSortDate (event) {
this.sortByDate()
}
renderTickets = (tickets: Ticket[]) => {
const filteredTickets = tickets
.filter((t) => (t.title.toLowerCase() + t.content.toLowerCase()).includes(this.state.search.toLowerCase()));
return (<ul className='tickets'>
{filteredTickets.map((ticket) => (<li key={ticket.title} className='ticket'>
<h5 className='title'>{ticket.title}</h5>
<button onClick={this.rename}>Rename</button>
<h6 className='meta-data'> {ticket.content}</h6>
<footer>
<div className='meta-data'>By {ticket.userEmail} | { new Date(ticket.creationTime).toLocaleString()}</div>
</footer>
</li>))}
</ul>);
}
render() {
const {tickets} = this.state;
return (<main>
<button onClick={this.darkMode}>Dark mode</button>
<h1>Tickets List</h1>
<header>
<input type="search" placeholder="Search..." onChange={(e) => this.onSearch(e.target.value)}/>
</header>
<button onClick={this.toggleSortDate}>Sort by date</button>
<button onClick={()=>this.onSort('date')}>Sort By Title</button>
<button onClick={()=>this.onSort('date')}>Sort By Email</button>
{tickets ? <div className='results'>Showing {tickets.length} results</div> : null }
{tickets ? this.renderTickets(tickets) : <h2>Loading..</h2>}
</main>)
}
}
export default App;
/* <button onclick={this.sort(creationTime)}>Sort by date</button>*/
我非常感谢一些帮助:)
编辑
非常感谢您的帮助,我已按照#k-wasilewski 的建议添加了构造函数,并且我将排序更新为此并且它可以工作:
sortByDate () {
const {tickets} = this.state
const arr = [...tickets].sort((a, b) => (a.creationTime < b.creationTime)? 1:-1)
console.log(tickets)
this.setState({
tickets : arr
})
console.log(arr);
}
SortDate (event) {
this.sortByDate()
}
解决方案
要使全局this
可识别,必须在构造函数中绑定您的函数:
constructor() {
super();
this.toggleSortDate = this.toggleSortDate.bind(this);
}
或者只使用箭头函数,默认情况下它们是绑定的:
const toggleSortDate = (event) => {
// ...
}
推荐阅读
- javascript - angularjs手风琴仅打开时如何调用函数
- java - 无法解析“:app@debug/compileClasspath”的依赖关系:gradle 同步时无法解析 com.google.android.things:androidthings:1.0 错误
- asp.net-mvc - 如何在不同区域使用具有区域和相同控制器名称的 Web API?
- ios - 检查 RTMP 和非 RTMP url 的代码?
- javascript - 如何导入字符串值(x、y、z)以在 three.js 中生成几何图形?
- c# - 列表中的 LINQ 多个分组依据
然后转换为列表 - sql - 如何将大表导出/假脱机到 Oracle 中的文件
- kubernetes - 在更少的内存上安装 kubernetes
- sql - 在oracle中将行数据转换为列
- raspberry-pi - 在 Scratch 中查看远程摄像机流