From 906180ad3f099e67e26a2d373e4ba7fce808d40d Mon Sep 17 00:00:00 2001 From: AllenFang Date: Sun, 13 May 2018 16:13:06 +0800 Subject: [PATCH] implement context-based container --- packages/react-bootstrap-table2/index.js | 4 +- .../react-bootstrap-table2/src/container.js | 71 ----------------- .../src/contexts/data-context.js | 35 +++++++++ .../src/contexts/index.js | 76 +++++++++++++++++++ 4 files changed, 113 insertions(+), 73 deletions(-) delete mode 100644 packages/react-bootstrap-table2/src/container.js create mode 100644 packages/react-bootstrap-table2/src/contexts/data-context.js create mode 100644 packages/react-bootstrap-table2/src/contexts/index.js diff --git a/packages/react-bootstrap-table2/index.js b/packages/react-bootstrap-table2/index.js index c134e64..c603b60 100644 --- a/packages/react-bootstrap-table2/index.js +++ b/packages/react-bootstrap-table2/index.js @@ -1,5 +1,5 @@ import BootstrapTable from './src/bootstrap-table'; -import withDataStore from './src/container'; +import withContext from './src/contexts'; -export default withDataStore(BootstrapTable); +export default withContext(BootstrapTable); diff --git a/packages/react-bootstrap-table2/src/container.js b/packages/react-bootstrap-table2/src/container.js deleted file mode 100644 index 195ef25..0000000 --- a/packages/react-bootstrap-table2/src/container.js +++ /dev/null @@ -1,71 +0,0 @@ -/* eslint no-return-assign: 0 */ -/* eslint react/prop-types: 0 */ -import React, { Component } from 'react'; -import Store from './store'; -import withSort from './sort/wrapper'; -import withSelection from './row-selection/wrapper'; - -import remoteResolver from './props-resolver/remote-resolver'; -import _ from './utils'; - -const withDataStore = Base => - class BootstrapTableContainer extends remoteResolver(Component) { - constructor(props) { - super(props); - this.store = new Store(props.keyField); - this.store.data = props.data; - this.wrapComponents(); - } - - componentWillReceiveProps(nextProps) { - this.store.setAllData(nextProps.data); - } - - wrapComponents() { - this.BaseComponent = Base; - const { pagination, columns, filter, selectRow, cellEdit } = this.props; - if (pagination) { - const { wrapperFactory } = pagination; - this.BaseComponent = wrapperFactory(this.BaseComponent, { - remoteResolver - }); - } - - if (columns.filter(col => col.sort).length > 0) { - this.BaseComponent = withSort(this.BaseComponent); - } - - if (filter) { - const { wrapperFactory } = filter; - this.BaseComponent = wrapperFactory(this.BaseComponent, { - _, - remoteResolver - }); - } - - if (cellEdit) { - const { wrapperFactory } = cellEdit; - this.BaseComponent = wrapperFactory(this.BaseComponent, { - _, - remoteResolver - }); - } - - if (selectRow) { - this.BaseComponent = withSelection(this.BaseComponent); - } - } - - render() { - const baseProps = { - ...this.props, - store: this.store - }; - - return ( - - ); - } - }; - -export default withDataStore; diff --git a/packages/react-bootstrap-table2/src/contexts/data-context.js b/packages/react-bootstrap-table2/src/contexts/data-context.js new file mode 100644 index 0000000..9a08976 --- /dev/null +++ b/packages/react-bootstrap-table2/src/contexts/data-context.js @@ -0,0 +1,35 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +export default () => { + const DataContext = React.createContext(); + + class DataProvider extends Component { + static propTypes = { + data: PropTypes.array.isRequired, + children: PropTypes.node.isRequired + } + + state = { data: this.props.data }; + + componentWillReceiveProps(nextProps) { + this.setState(() => ({ data: nextProps.data })); + } + + render() { + return ( + + { this.props.children } + + ); + } + } + return { + Provider: DataProvider, + Consumer: DataContext.Consumer + }; +}; diff --git a/packages/react-bootstrap-table2/src/contexts/index.js b/packages/react-bootstrap-table2/src/contexts/index.js new file mode 100644 index 0000000..6afb979 --- /dev/null +++ b/packages/react-bootstrap-table2/src/contexts/index.js @@ -0,0 +1,76 @@ +/* eslint no-return-assign: 0 */ +/* eslint react/prop-types: 0 */ +import React, { Component } from 'react'; +// import Store from './store'; +// import withSort from './sort/wrapper'; +// import withSelection from './row-selection/wrapper'; +import createDataContext from './data-context'; +import createSortContext from './sort-context'; +import createSelectionContext from './selection-context'; + +import remoteResolver from '../props-resolver/remote-resolver'; + + +const withContext = (Base) => { + let DataContext; + let SelectionContext; + let SortContext; + + return class BootstrapTableContainer extends remoteResolver(Component) { + constructor(props) { + super(props); + DataContext = createDataContext(this.props.data); + SelectionContext = createSelectionContext(); + SortContext = createSortContext(); + } + + render() { + const { keyField, columns, remote } = this.props; + const baseProps = { keyField, columns, remote }; + + return ( + + + { + dataProps => ( + + + { + selectionProps => ( + + + { + sortProps => ( + + ) + } + + + ) + } + + + ) + } + + + ); + } + }; +}; + +export default withContext;