- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试遵循这个 ReactJS 教程:
第 1 部分:http://4dev.tech/2015/12/reactjs-datatable-with-sort-filter-and-pagination-example-part-1/
第 2 部分:http://4dev.tech/2016/03/tutorial-sorting-and-filtering-a-reactjs-datatable/
我成功完成了第 1 部分,我需要一些帮助才能完成第 2 部分。
这是我的第 2 部分代码:
import React from 'react';
import {Table, Column, Cell} from 'fixed-data-table';
class MyTable extends React.Component {
constructor(props) {
super(props);
this.rows = [{"id":1,"first_name":"William","last_name":"Elliott","email":"welliott0@wisc.edu",
"country":"Argentina","ip_address":"247.180.226.89"},
{"id":2,"first_name":"Carl","last_name":"Ross","email":"cross1@mlb.com",
"country":"South Africa","ip_address":"27.146.70.36"},
{"id":3,"first_name":"Jeremy","last_name":"Scott","email":"jscott2@cbsnews.com",
"country":"Colombia","ip_address":"103.52.74.225"},
]
this.state = {
filteredDataList: this.rows
};
}
_renderHeader(label, cellDataKey) {
return <div>
<span>{label}</span>
<div>
<br />
<input style={{width:90+'%'}} onChange={this._onFilterChange.bind(this, cellDataKey)}/>
</div>
</div>;
}
_onFilterChange(cellDataKey, event) {
if (!event.target.value) {
this.setState({
filteredDataList: this.rows,
});
}
var filterBy = event.target.value.toString().toLowerCase();
var size = this.rows.length;
var filteredList = [];
for (var index = 0; index < size; index++) {
var v = this.rows[index][cellDataKey];
if (v.toString().toLowerCase().indexOf(filterBy) !== -1) {
filteredList.push(this.rows[index]);
}
}
this.setState({
filteredDataList: filteredList,
});
}
render() {
return <Table
height={40+((this.rows.length+1) * 30)}
width={1150}
rowsCount={this.rows.length}
rowHeight={30}
headerHeight={30}
rowGetter={function(rowIndex) {return this.rows[rowIndex]; }.bind(this)}>
<Column dataKey="id" width={50} label="Id"
headerRenderer={this._renderHeader.bind(this)}/>
<Column dataKey="first_name" width={200} label="First Name" />
<Column dataKey="last_name" width={200} label="Last Name" />
<Column dataKey="email" width={400} label="e-mail" />
<Column dataKey="country" width={300} label="Country" />
</Table>;
}
}
module.exports = MyTable;
`rowGetter` will be DEPRECATED in version 0.7.0 of FixedDataTable and beyond.
Please use the cell API in Column to fetch data for your cells.
Read the docs at: https://fburl.com/FixedDataTable-v0.6
`label` will be DEPRECATED in version 0.7.0 of FixedDataTable and beyond.
Please use `header` instead.
Read the docs at: https://fburl.com/FixedDataTable-v0.6
`dataKey` will be DEPRECATED in version 0.7.0 of FixedDataTable and beyond.
Please use the `cell` API to pass in a dataKey
Read the docs at: https://fburl.com/FixedDataTable-v0.6
`headerRenderer` will be DEPRECATED in version 0.7.0 of FixedDataTable and beyond.
Please use the `header` API to pass in a React Element instead.
Read the docs at: https://fburl.com/FixedDataTable-v0.6
最佳答案
虽然这个问题已经有一年了,但我最近遇到了类似的麻烦,可以分享我的经验。另外,我不知道您对 React 的熟悉程度是多少,但我会尝试以初学者友好的方式进行解释以帮助其他人,所以如果有任何明显的问题,请耐心等待。
因此,您收到的浏览器错误是由于另一个答案中提到的 API 更改造成的。您引用的教程使用的是旧 API。新的 API 更改涉及几件事。也就是说,您无法再访问 rowGetter
、 headerDataGetter
、 headerRenderer
、 dataKey
和 label
等。
新 API 涉及将数据直接提供到单元组件中,我将对此进行演示。
所以首先,您现在可以制作自定义单元格,这样您就可以将它们设置为具有您想要的行为。我们将创建一个文本单元类 MyTextCell
来在网格中显示文本,以及一个标题单元类 SortHeaderCell
,我们可以点击它对列进行排序,并显示一个显示排序顺序的箭头。您也可以为电子邮件列添加自定义单元格类,以创建电子邮件地址链接。
我将首先介绍排序,因为我认为这更困难。这基本上使用与文档中的示例相同的方法。
现在您拥有的数据只是一个数组,这很好。文档使用 DataListWrapper 类,但是,它有一个包含数据的 _data
属性,以及用于排序索引的另一个 _indexMap
属性,所以让我们这样做(请注意,如果您正在查看文档中的示例,我对它进行了一些更改少量):
class DataListWrapper {
constructor(indexMap, data) {
this._indexMap = indexMap;
this._data = data;
}
getSize() {
return this._indexMap.length;
}
getObjectAt(index) {
let sortedIdx = this._indexMap[index];
return this._data[sortedIdx];
}
}
您可以将前面提到的自定义单元格类型制作为无状态组件,例如我们的自定义文本单元格:
const MyTextCell = ({ rowIndex, field, data, ...props }) => {
return (
<Cell {...props}>
{data.getObjectAt(rowIndex)[field]}
</Cell>
);
}
或者,您可以像在此自定义排序标题单元格中一样使它们有状态。没有理由每个都有一个,我只是想演示这两个选项:
class SortHeaderCell extends React.Component {
constructor(props) {
super(props);
this._onSortChange = this._onSortChange.bind(this);
}
render() {
let {onSortChange, sortDir, children, ...props } = this.props;
console.log(this.props)
return (
<Cell {...props}>
<a onClick={this._onSortChange}>
{children} {sortDir ? (sortDir === SortTypes.DESC ? '↓' : '↑') : ''}
</a>
</Cell>
);
}
_onSortChange(e) {
e.preventDefault();
if (this.props.onSortChange) {
this.props.onSortChange(
this.props.columnKey,
this.props.sortDir ?
reverseSortDirection(this.props.sortDir) :
SortTypes.DESC
);
}
}
}
您还需要创建排序类型:
const SortTypes = {
ASC: 'ASC',
DESC: 'DESC',
};
以及一种反向排序类型的快速方法:
function reverseSortDirection(sortDir) {
return sortDir === SortTypes.DESC ? SortTypes.ASC : SortTypes.DESC;
}
需要注意的一件事 - 我们在标题中有一个
_onSortChange
方法,用于显示箭头并调用实际对数据进行排序的方法,但该方法将在实际的表组件中。
componentWillReceiveProps(props) {
this._defaultSortIndexes = [];
var size = props.myDataArray.length;
for (var index = 0; index < size; index++) {
this._defaultSortIndexes.push(index);
}
this.setState({ myTableData: props.myDataArray, sortedFilteredDataList: new DataListWrapper(this._defaultSortIndexes, props.myDataArray) })
}
所以,现在您的标题知道如何显示箭头以及如何调用表本身的
_onSortChange
方法。您的表组件也知道如何通过 props 接收数据数组,并将其放入 DataWrapper,并将其添加到 state。所以我们必须在表中创建
_onSortChange
方法,它实际上会将数据包装器中的 sortIndexes 设置为正确的顺序:
_onSortChange(columnKey, sortDir) {
var sortIndexes = this._defaultSortIndexes.slice();
sortIndexes.sort((indexA, indexB) => {
var valueA = this.state.myTableData[indexA][columnKey];
var valueB = this.state.myTableData[indexB][columnKey];
var sortVal = 0;
if (valueA > valueB) {
sortVal = 1;
}
if (valueA < valueB) {
sortVal = -1;
}
if (sortVal !== 0 && sortDir === SortTypes.ASC) {
sortVal = sortVal * -1;
}
return sortVal;
});
this.setState({
sortedFilteredDataList: new DataListWrapper(sortIndexes, this.state.myTableData),
colSortDirs: {
[columnKey]: sortDir,
},
});
}
所以现在,你可以像这样设置你的列:
<Column
columnKey='country'
header={
<SortHeaderCell
onSortChange={this._onSortChange}
sortDir={colSortDirs.country}>
Country
</SortHeaderCell>}
cell={
<MyTextCell
data={this.state.sortedFilteredDataList}
field="country"
/>
}
width={150}
/>
这几乎是排序。文档演示了类似的过滤方式,使用带有过滤器索引的 DataListWrapper。我没有这样做,只是在我的表组件嵌套的组件中过滤了我的数据数组。本质上,我有一个组件负责通过 props 将数据传递到 table 组件,并在那里过滤。我这样做:
filterSearch(searchTerm) {
this.setState({
filteredData: this.state.myData.filter(function (el) {
return (el.propertyToFilter.includes(searchTerm) || !searchTerm);
})
});
}
然后我呈现我的搜索组件和我的表格组件:
<div>
<div>
<SearchBox onSearchTermChange={this.filterSearch} />
</div>
<br />
<div className="row">
<div>
<ResultsTable myDataArray={this.state.filteredData} />
</div>
</div>
</div>
我的搜索框组件是这样的:
class SearchBox extends Component{
constructor(props) {
super(props);
this.state= {term: ''};
}
render() {
return (
<div>
<input
value={this.state.term}
onChange={(e)=>this.onInputChange(e.target.value)}></input>
</div>
)
}
onInputChange(term){
this.setState({term});
this.props.onSearchTermChange(term);
}
}
export default SearchBox;
差不多就是这样。您还应该注意,现在不支持固定数据表,您应该使用固定数据表 2。也就是说,我在固定数据表中完成了上述所有操作,它应该可以工作。
关于ReactJS FixedDataTable 排序和过滤示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40932776/
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Sample data for IPv6? 除了 wireshark 在其网站上提供的内容之外,是否有可以下
我正在寻找可以集成到现有应用程序中并使用多拖放功能的示例或任何现成的解决方案。我在互联网上找到的大多数解决方案在将多个项目从 ListBox 等控件拖放到另一个 ListBox 时效果不佳。谁能指出我
我是 GATE Embedded 的新手,我尝试了简单的示例并得到了 NoClassDefFoundError。首先我会解释我尝试了什么 在 D:\project\gate-7.0 中下载并提取 Ga
是否有像 Eclipse 中的 SWT 示例那样的多合一 JFace 控件示例?搜索(在 stackoverflow.com 上使用谷歌搜索和搜索)对我没有帮助。 如果它是一个独立的应用程序或 ecl
我找不到任何可以清楚地解释如何通过 .net API(特别是 c#)使用谷歌计算引擎的内容。有没有人可以指点我什么? 附言我知道 API 引用 ( https://developers.google.
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
我正在尝试为我的应用程序设计配置文件格式并选择了 YAML。但是,这(显然)意味着我需要能够定义、解析和验证正确的 YAML 语法! 在配置文件中,必须有一个名为 widgets 的集合/序列。 .这
你能给我一个使用 pysmb 库连接到一些 samba 服务器的例子吗?我读过有类 smb.SMBConnection.SMBConnection(用户名、密码、my_name、remote_name
linux服务器默认通过22端口用ssh协议登录,这种不安全。今天想做限制,即允许部分来源ip连接服务器。 案例目标:通过iptables规则限制对linux服务器的登录。 处理方法:编
我一直在寻找任何 PostProjectAnalysisTask 工作代码示例,但没有看。 This页面指出 HipChat plugin使用这个钩子(Hook),但在我看来它仍然使用遗留的 Po
我发现了 GWT 的 CustomScrollPanel 以及如何自定义滚动条,但我找不到任何示例或如何设置它。是否有任何示例显示正在使用的自定义滚动条? 最佳答案 这是自定义 native 滚动条的
我正在尝试开发一个 Backbone Marionette 应用程序,我需要知道如何以最佳方式执行 CRUD(创建、读取、更新和销毁)操作。我找不到任何解释这一点的资源(仅适用于 Backbone)。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 去年关闭。 Improve this
我需要一个提交多个单独请求的 django 表单,如果没有大量定制,我找不到如何做到这一点的示例。即,假设有一个汽车维修店使用的表格。该表格将列出商店能够进行的所有可能的维修,并且用户将选择他们想要进
我有一个 Multi-Tenancy 应用程序。然而,这个相同的应用程序有 liquibase。我需要在我的所有数据源中运行 liquibase,但是我不能使用这个 Bean。 我的应用程序.yml
我了解有关单元测试的一般思想,并已在系统中发生复杂交互的场景中使用它,但我仍然对所有这些原则结合在一起有疑问。 我们被警告不要测试框架或数据库。好的 UI 设计不适合非人工测试。 MVC 框架不包括一
我正在使用 docjure并且它的 select-columns 函数需要一个列映射。我想获取所有列而无需手动指定。 如何将以下内容生成为惰性无限向量序列 [:A :B :C :D :E ... :A
$condition使用说明和 $param在 findByAttributes在 Yii 在大多数情况下,这就是我使用 findByAttributes 的方式 Person::model()->f
我在 Ubuntu 11.10 上安装了 qtcreator sudo apt-get install qtcreator 安装的版本有:QT Creator 2.2.1、QT 4.7.3 当我启动
我是一名优秀的程序员,十分优秀!