我在react+redux应用程序中使用了Ag网格。我需要使网格的列状态持久化。换句话说,每次用户对列进行更改(排序、排序、隐藏\显示等)时,应用程序必须将列状态保存到数据库中。然后,当用户再次访问时,必须恢复列状态。我的方法是在各种事件回调中使用columnApi.getColumnState()将状态推送到DB,并在componentDidMount的redux操作中使用columnApi.setColumnState()。我没有收到任何错误,但是没有应用状态。下面是我的组件示例代码(我使用的是react-thunk):
@(connect(selector, { getColumnStateAction, saveColumnStateAction }) as any)
class MyComponent extends Component<Props, {}> {
private columnApi:any
onGridReady(params) {
const { columnState } = this.props
params.columnApi.setColumnState(columnState)
this.columnApi = params.columnApi
}
onColumnChanged() {
saveColumnStateAction(this.columnApi.getColumnState())
}
componentDidMount() {
getColumnStateAction()
}
render() {
const { columnDefs } this.props
const gridOptions = {
columnDefs,
onGridReady: this.onGridReady,
onColumnVisible: this.onColumnChanged,
onColumnResized: this.onColumnChanged,
onColumnMoved: this.onColumnChanged,
onColumnPinned: this.onColumnChanged
}
<AgGridReact { ...gridOptions } />
}
}下面是我的行动:
const getColumnStateAction = () => async(dispatch:Dispatch) => {
const columnState = await fetchFromDb();
dispatch({ type:'GET_COLUMN_STATE', payload:columnState })
}
const saveColumnStateAction = (columnState:any) => async(dispatch:Dispatch) => {
await saveToDb(columnState);
dispatch({ type:'SAVE_COLUMN_STATE' })
}我的问题是:我应该在何时何地恢复columnState,以便将其应用于我的网格。重点是,在使用redux之前,我已经有了可用的代码。下面的代码工作正常,状态被正确应用:
@(connect(selector, { getColumnStateAction, saveColumnStateAction }) as any)
class MyComponent extends Component<Props, {}> {
private columnApi:any
onGridReady(params) {
this.columnApi = params.columnApi
}
async onColumnChanged() {
await saveToDb(this.columnApi.getColumnState());
}
async componentDidMount() {
const columnState = await fetchFromDb();
this.columnApi.setColumnState(columnState)
}
render() {
const { columnDefs } this.props
const gridOptions = {
columnDefs,
onGridReady: this.onGridReady,
onColumnVisible: this.onColumnChanged,
onColumnResized: this.onColumnChanged,
onColumnMoved: this.onColumnChanged,
onColumnPinned: this.onColumnChanged
}
<AgGridReact { ...gridOptions } />
}
}所以我怀疑我在redux上做错了什么。请帮帮忙。
发布于 2019-02-12 10:57:21
我想,我已经找到解决方案了。它可能不是最优雅的,但它是有效的。关键是我只能在特定的时刻调用columnApi.setColumnState()一次-在componentDidMount、onGridReady之后以及列已经出现在网格中的时候。这是我的工作示例:
@(connect(selector, { getColumnStateAction, saveColumnStateAction }) as any)
class MyComponent extends Component<Props, {}> {
public state:any = { columnStateSet: false }
private columnApi:any
onGridReady(params) {
const { columnState } = this.props
this.columnApi = params.columnApi
}
onColumnChanged() {
saveColumnStateAction(this.columnApi.getColumnState())
}
/**
* Catches a moment for applying persisted column state
* The point is that previous columnState, that we get from DB, must be applied in specific moment.
* It must be applied once per loading component after all columns are already set and columnApi becomes available.
* Otherwise column state will not be applied correctly.
*/
private onGridColumnsChanged = () => {
const { columnStateSet } = this.state
const { columnState } = this.props
if(this.columnApi && columnState && !columnStateSet) {
this.columnApi.setColumnState(columnState)
this.setState({ columnStateSet: true})
}
}
componentDidMount() {
getColumnStateAction()
this.setState({ columnStateSet: false })
}
render() {
const { columnDefs } this.props
const gridOptions = {
columnDefs,
onGridReady: this.onGridReady,
onColumnVisible: this.onColumnChanged,
onColumnResized: this.onColumnChanged,
onColumnMoved: this.onColumnChanged,
onColumnPinned: this.onColumnChanged,
onGridColumnsChanged: this.onGridColumnsChanged
}
<AgGridReact { ...gridOptions } />
}
}希望对某些人有帮助。
https://stackoverflow.com/questions/54613385
复制相似问题