【问题标题】:How to arrange React child components order?如何安排 React 子组件顺序?
【发布时间】: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个子组件,SearchBarTablePaginationBar

所以我很难重写它来渲染道具的方式来改变如下的顺序

<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

我修改了&lt;PaginationTable&gt;的渲染函数如下,但是在&lt;SearchInput&gt;上打字时会失去鼠标光标焦点

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 = ()=&gt;(...)进行新的组件引用。

感谢@Ralph Najm

如果我如下声明子组件,DOM 不会每次都更新。

render(){
    const SearchBar = (<input onChange={...} />);
    const TableElement = (<Table .../>);
    const PaginationBar = (<Menu .../>);
    //... same as above
}

通过这种方式,我可以将我的组件更改为渲染道具,以便非常轻松地安排顺序。

提前致谢。

【问题讨论】:

  • 请包含所有必要的代码(但最少;see this help page)。特别是,如果您不向我们展示render 代码,我们将无法帮助您处理您在PaginationTablerender 中所做的事情。
  • 什么版本的 React?我之所以问,是因为解决方案可能涉及 fragments,在 v16 中添加,并且可以在 v16.2 及更高版本中变得更加优雅,感谢improvements to fragments
  • 很抱歉我发帖后没有留下来。我正在使用 React 16.5。在工作示例中,渲染代码大约有 100 行,我认为这个问题太长了,所以我没有再做一个最小的问题。稍后我会将我的问题编辑为一个最小的问题。谢谢。

标签: javascript reactjs jsx


【解决方案1】:

在 PaginationTable 组件中更改您的 render 函数并在 return 语句之前,将元素分配给变量(SearchBar、Table、PaginationBar 等),然后在渲染函数中引用这些变量。

我在这里修改了你的例子https://codesandbox.io/s/vy4799zp45

【讨论】:

  • 欢迎来到 Stack Overflow!感谢您的贡献!请环顾四周,并通读help center。关于 SO 的问题和答案必须独立。在答案本身的文本中包含所有相关的代码更改,而不仅仅是作为链接。两个原因:人们不应该离开现场才能完全理解答案;和链接腐烂,使问题及其答案对未来的人们毫无用处。 (OP的问题也有同样的问题。)
  • 哇!我以类似的方式进行操作,但得到了完全不同的结果。我在 渲染函数中做了3个真实的组件,比如const SearchBar = ()=&gt;(&lt;Input ... /&gt;);并将它们作为 return ( .... ) 返回但是这样,在我在 SearchBar 上输入文本后,我失去了鼠标焦点,然后我意识到它使我的 dom 更新了每次。谢谢。我不应该将它们更改为组件。我应该只将它们更改为 javascript 变量。
  • 很高兴我能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2017-03-22
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
相关资源
最近更新 更多