账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    如何优雅的调整 React 组件内的子组件位置?
    • 2018-10-27 00:00
    • 10
    49
    0

    基於 react-semantic-ui ,我组合出了一个可以 搜寻和换页的的 Table 组件。
    叫做 <PaginatedTable />

    working example: https://codesandbox.io/s/23q6...

    使用方式如下

    <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"]}
      />

    但这组件目前只能有固定的顺序如下:

    <PaginationTable>
     <SearchBar />
     <Table />
     <PaginationBar />
    </PaginationTable>

    而我在组件内其实并没有拆分 SearchBar, Table, PaginationBar 这样三个子组件。
    所以我无法利用 render props 的技巧去调整子组件的位置。
    若修改成 render props 後,就可这样使用调整子组件的位置:

    <PaginationTable {...其他 props}>
    {({ SearchBar, Table, PaginationBar  })=>
    <div>
     <SearchBar />
     <Table />
     <SearchBar />
    </PaginationTable>
    </div>
    </PaginationTable>
    

    当我尝试去改成 render props ,遇到很多麻烦,因为当拆成三个子组件时,我必须把原本用到 <PaginationTable> 中 this 的相关变数 ( this.state, this.props, this.xxxFunction ) 都修改,例如原本
    在 <PaginationTable> 中 用到 this.setState({ searchBarText: e.target.value }) 就必须改成修改很多写法才能传递下去

    
    <SearchBar onTextChange={()=>{
    
        this.setState({
            searchBarText: e.target.value
        });
    }} />
    

    请问有什麽方式可以做到,优雅的调整子组件的顺序,又不用特别为这件事情改成 render Props 的写法呢?
    又或者要怎麽更优雅的改成 render props 呢?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 武异 普通会员 1楼

      在React中,我们可以使用CSS或者第三方库如react-dnd进行组件的位置调整。以下是一些优雅的调整React组件内的子组件位置的方法:

      1. CSS调整:我们可以使用CSS来调整子组件的位置。这需要我们将子组件包裹在另一个容器中,然后设置该容器的CSS样式。例如:

      ```jsx function MyComponent() { return (

      ); }

      function MySubComponent() { return (

      ); } ```

      在这个例子中,MyComponent是组件的父组件,MySubComponent是子组件。MySubComponent的位置是通过设置position属性为absolute和top和left属性为0来实现的。然后,MyComponent的样式会被应用到其子组件上。

      1. 第三方库调整:如果我们的组件使用了第三方库如react-dnd,我们可以使用这个库提供的API来调整子组件的位置。例如:

      ```jsx import { useDrag } from 'react-dnd';

      function MyComponent({ ref }) { const [draggable, setDraggable] = useDrag({ x: 0, y: 0 });

      return (

      ); }

      function MySubComponent({ draggable }) { return (

      ); } ```

      在这个例子中,我们使用了useDrag hook来获取子组件的draggable属性。然后,我们可以通过设置draggable属性为true来启用Draggable特性。最后,我们可以在子组件上使用draggable属性来设置其位置。

      以上两种方法都可以优雅地调整React组件内的子组件位置,选择哪种方法取决于你的具体需求。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部