【发布时间】:2019-03-31 21:06:02
【问题描述】:
使用react-semantic-ui,我制作了一个可搜索、可分页的 Table React 组件
工作示例:https://codesandbox.io/s/23q6vlywy
用法
<PaginationTable
items={[
{
id: 1,
name: "test-item-1 ???"
},
{
id: 2,
name: "test-item-2"
},
{
id: 3,
name: "test-item-3"
}
]}
columnOption={[
{
header: "idHeader",
cellValue: "id",
onItemClick: item => {
alert(item.id);
},
sortingField: "id"
},
{
header: "Name~",
cellValue: item =>
`*custom text cannot be searched* property can item.name => ${
item.name
} `,
onItemClick: item => {
alert(item.name);
},
sortingField: "name"
}
]}
initSortingField={"id"}
initSortingOrderAsc={false}
pagination
itemsPerPage={2}
searchKeyProperties={["id", "name"]}
/>
但是这个组件目前只能有一定的顺序
1.SearchBar on top
2.Table on middle
3.PaginationBar on bottom
实际上,我并没有在Component中写3个子组件,SearchBar,Table,PaginationBar
所以我很难重写它来渲染道具的方式来改变如下的顺序
<PaginationTable {...props}>
{({ SearchBar, Table, PaginationBar })=>
<div>
<SearchBar />
<Table />
<SearchBar />
</PaginationTable>
</div>
</PaginationTable>
因为我在尝试更改render props时,首先要独立编写3个组件,这意味着我必须将this(this.state,this.props,this.xxxFunction)下的所有变量都更改为别的东西.
例如:
在,我可以用
<Input onChange={()=>{
this.setState({ searchBarText: e.target.value });
}}/>
但是如果我把它改成 3 个组件,我必须把它重写成类似的东西
const SearchBar = ({onTextChange}) => <Input onChange=
{onTextChange}/>
<SearchBar onTextChange={()=>{
this.setState({
searchBarText: e.target.value
});
}} />
有什么方法可以优雅地调整子组件的顺序,或者有什么方法可以更轻松地编写渲染道具?
更新@2018.10.27 17:36 +08:00
我修改了<PaginationTable>的渲染函数如下,但是在<SearchInput>上打字时会失去鼠标光标焦点
render(){
const SearchBar = ()= (<Input onChange={()=>{...} />);
const TableElement = ()=>(<Table {...} > ... </Table>);
const PaginationBar = ()=>(<Menu {...} > ... </Menu>);
enter code here
return(
<React.Fragment>
{this.props.children({ SearchBar,TableElement, PaginationBar })}
</React.Fragment>)};
然后我发现,这样一来,每次我的状态更新时,DOM都会更新,因为每次渲染都会通过const SearchBar = ()=>(...)进行新的组件引用。
感谢@Ralph Najm
如果我如下声明子组件,DOM 不会每次都更新。
render(){
const SearchBar = (<input onChange={...} />);
const TableElement = (<Table .../>);
const PaginationBar = (<Menu .../>);
//... same as above
}
通过这种方式,我可以将我的组件更改为渲染道具,以便非常轻松地安排顺序。
提前致谢。
【问题讨论】:
-
请包含所有必要的代码(但最少;see this help page)。特别是,如果您不向我们展示
render代码,我们将无法帮助您处理您在PaginationTable的render中所做的事情。 -
什么版本的 React?我之所以问,是因为解决方案可能涉及 fragments,在 v16 中添加,并且可以在 v16.2 及更高版本中变得更加优雅,感谢improvements to fragments。
-
很抱歉我发帖后没有留下来。我正在使用 React 16.5。在工作示例中,渲染代码大约有 100 行,我认为这个问题太长了,所以我没有再做一个最小的问题。稍后我会将我的问题编辑为一个最小的问题。谢谢。
标签: javascript reactjs jsx