javascript - 从渲染 Prop 中重用 React 组件

标签 javascript reactjs jsx

我用 render props 的方式写了一个 React 组件,它将用 3 个 React 组件对象调用子函数(具体名称不确定,是执行 jsx (<div>...</div>) 生成的变量);

<PaginatedTable>使用示例:

<PaginationTable data={data} ...otherprops>
    {({ SearchBar, Table, PaginationBar })=>
        (<div>
            {SearchBar}
            {Table}
            {PaginationBar}
        </div>)
    }
</PaginationTable>

使用渲染 Prop ,我很高兴可以非常轻松地自定义这 3 个子组件对象,例如重新排列顺序或在这三个子组件之间添加自定义元素。

{({ SearchBar, Table, PaginationBar })=>
        (<div>
            {PaginationBar}
            <h1> my custom search bar text </h1>
            {SearchBar}
            {Table}

        </div>)
    }

但现在我希望的不仅仅是在里面排列顺序,我希望我可以将 {SearchBar} 移出到 sibling 的子级的同一层,例如这张图片。

工作演示:https://codesandbox.io/s/23q6vlywy

enter image description here

我认为这可能是 React 单向数据流的反模式。

摘录{SearchBar}到另一个独立组件,然后将其用作 <SearchBar ... /> <ToolBarArea />里面这是我从 React Doc 中学到的。

但是这样,我必须“提升状态”并编写 <PaginationTable /> 中已有的类似函数和状态。像下面的**文本**部分是 <PaginationTable /> 中已经具有的功能和状态

class ToolBarArea extends Component{
    render(){
        return(
        <div>
            // text
            <SearchBar onChange={**this.props.onSearchBarChange**} />
            //.... other text or elements
        </div>);
    }
}
class ContainerArea extends Component {
    state={
        **searchBarText:'',**
        tableData : [{...}, {...}]
    }
    **onSearchBarTextChange = (event)=>{
        this.setState({ searchBarText: event.target.value });
    }
    filterdTableData = ()=> this.state.tableData.filter(d=>d.name.includes(this.state.searchBarText);
    **
}

我真的希望有一种方法可以简单地移动变量 {SearchBar}在渲染 props 函数中,不知道它是在父级、父级的兄弟级还是 DOM 树中的任何位置。

比如

<ToolBarArea>
    {SearchBar} // SearchBar from <PaginationTable />
</ToolBarArea>

有没有办法重复利用onSearchBarTextChangefiltedTableData函数和我已经在<PaginationTable />中编写的这些**文本**代码?

最佳答案

我相信当您提到提升状态时,您一语中的。如果您已经编写了类似的函数,那么您最好的选择可能是“抽象”该函数,以便它适用于这两个用例。您可以使用一个简单的标志来区分每个需要的独特执行。然后最后将函数传递给两个组件。

如果您坚决要避免这种方法,那么从技术上讲,您可以通过使用事件监听器来处理数据传输或监视窗口中的变量来绕过它,但这肯定是一种反模式。

关于javascript - 从渲染 Prop 中重用 React 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53023408/

相关文章:

javascript - 如何保存javascript所做的内容更改

JavaScript - 跨浏览器检测 ESC 键

javascript - JQueryUI 自动完成不会从选择框中更新其数据属性

javascript - 将函数传递给reactjs中的子组件

reactjs - 在 makeStyles 中使用自定义主题

reactjs - 警告 : Received `true` for a non-boolean attribute `uk-grid`

javascript - 为什么这个密文总是以相同的字符开头?

reactjs - Formik onSubmit 函数不适用于我的代码

javascript - react map 函数: how to output content of all nested arrays at once?

react-native - 无法弄清楚如何正确使用 KeyboardAvoidingView