【问题标题】:Customize tablehead of react-gridjs自定义 react-gridjs 的表头
【发布时间】:2021-01-22 17:21:41
【问题描述】:

不使用默认搜索栏,我想自定义如下:

  1. 在搜索栏前面添加一个按钮。
  2. 在搜索占位符中使用图标 (<i className="fa fa-search"/>)。

到目前为止,这是我的代码:

import { Grid, _ } from 'gridjs-react';

const tableColumns = [
  'Name',
  'Phone',
  {
    name: 'Custom component',
    formatter: (text) => _(<b>{text}</b>)
  }
]
const tableData = [
  ['John', 12345, 'myText1'],
  ['Mike', 67891, 'myText2'],
]

export default function myCustomGrid() {
  return (
    <Grid
      sort={true}
      search={true} // This adds the search inp
      columns={tableColumns}
      data={tableData}
      language={{
        search: {
          placeholder: '???? Search...'
        }
      }}
      pagination={{
        enabled: true,
        limit: 2
      }}
    />
  );
}

【问题讨论】:

    标签: reactjs gridjs


    【解决方案1】:

    这对于portal 来说可能是一个很好的用例。

    这让我们可以更灵活地决定我们在哪里渲染我们的按钮。使用门户,我们可以使按钮成为搜索输入的兄弟:

    const gridjsHeadRoot = document.getElementsByClassName("gridjs-head");
    
    class GridHeaderButton extends React.Component {
      constructor(props) {
        super(props);
        this.el = document.createElement("button");
        this.el.innerText = "Click";
        this.el.style.cssText = `
          background-color: #0069d9;
          color: #fff; 
          border-radius: .25rem;
          padding: .375rem .75rem;
          float: right
        `;
        this.el.onclick = function () {
          // Do something
        };
      }
    
      componentDidMount() {
        gridjsHeadRoot[0].appendChild(this.el);
      }
    
      componentWillUnmount() {
        gridjsHeadRoot[0].removeChild(this.el);
      }
    
      render() {
        return ReactDOM.createPortal(this.props.children, this.el);
      }
    }
    

    那么你可以这样使用它:

    function MyCustomGrid() {
      return (
        <Grid
          sort={true}
          search={true} // This adds the search inp
          columns={tableColumns}
          data={tableData}
          language={{
            search: {
              placeholder: "? Search...",
            },
          }}
          pagination={{
            enabled: true,
            limit: 2,
          }}
        />
      );
    }
    
    export default function App() {
      return (
        <div className="App">
          <MyCustomGrid />
          <GridHeaderButton />
        </div>
      );
    }
    

    您放置GridHeaderButton 的顺序在这里很重要。因为GridHeaderButton 的目标是在MyCustomGrid 内渲染的元素,这意味着您应该将GridHeaderButton 放在CustomGrid 下方,否则它将不起作用。


    Sandbox Example

    【讨论】:

    • 好招!但是,示例中有 2 个小问题: 1-Column hover 当按钮悬停时触发。 2-列文本略高于排序箭头。
    • @AnisBenna 我认为我已经通过回答更新了一个更好的方法。它应该可以解决您提到的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多