MUI-DATATABLES,儿童组件检测父零件状态的变化 我是从React开始的,这个问题使我的睡眠消失了。 据我了解,状态(this.state)仅在创建的组件中才能访问,但是在我的项目中,...

问题描述 投票:0回答:1

https://github.com/gregnb/mui-datatables

传统组件:

import React from 'react'; import Typography from '@material-ui/core/Typography'; import DialogContent from '@material-ui/core/DialogContent'; import DialogTitle from '@material-ui/core/DialogTitle'; import Button from '@material-ui/core/Button'; // Components import CadcliFieldContent from './CadcliFieldContent'; class CadcliField extends React.Component { state = { isLoading: false, isNew: true, dialog: false, formData: { name: 'Test' } }; openDialog = () => { this.setState({ dialog: true }); } closeDialog = () => { this.setState({ dialog: false }); } formDataChange = name => event => { var formDataTemp = this.state.formData; formDataTemp[name] = event.target.value; this.setState({ formData: formDataTemp }); }; render () { return ( <div className="flex flex-1 w-full"> <div className="flex items-center justify-end"> <Button className="normal-case" variant="contained" color="secondary" role="button" onClick={this.openDialog} > <Icon>add</Icon> <span className="mx-1">{t('NEW_FIELD')}</span> </Button> </div> <CadcliFieldContent urlBase="cadcli-field/" /> <Dialog className='max-w-lg w-full m-24' onClose={this.closeDialog} open={this.state.dialog} > <DialogTitle component="div" className="p-0"> <Typography className="text-16 ml-8">Fields</Typography> </DialogTitle> <DialogContent className="p-16 sm:p-24"> <div className="flex items-center mb-24"> <TextField type="text" name="name" id="input-name" value={formData.name} onChange={this.formDataChange('name')} variant="outlined" fullWidth required /> </div> </DialogContent> </Dialog> </div> ); }; } export default CadcliField;

ChildComponent

import React from 'react'; import axios from 'axios'; import MUIDataTable from "mui-datatables"; import { CircularProgress, Typography } from '@material-ui/core'; class CadcliContent extends React.Component { state = { urlApi: process.env.REACT_APP_API_URL, page: 0, count: 1, rowsPerPage: 10, denseTable: true, idDeleteModal: 0, sortOrder: {}, filter: {}, search: '', data: [['Loading...']], columns: [ {name: 'id', label: this.props.t('utils:ACTIONS')}, {name: 'id', label: 'ID', options: { filterType : 'textField' }}, ], isLoading: false, }; componentDidMount() { this.getData(this.state.urlApi, 0); } // get data getData = async (url, page) => { this.setState({ isLoading: true }); const res = await this.axiosRequest(url, page); this.setState({ data: res.data, isLoading: false, count: res.total }); }; axiosRequest = (url, page, sortOrder = {}, filter = {}, searchText = '') => { url = url + '?page_size=' + this.state.rowsPerPage; url += '&page=' + (page + 1); // Ordering if (sortOrder.name !== undefined) { if (sortOrder.direction === 'asc') { url += '&ordering=' + sortOrder.name; } else { url += '&ordering=-' + sortOrder.name; } } // Filtering if (filter.length > 0) { var columnsTable = this.state.columns; filter.forEach(function(value, key){ if (value.length > 0) { url += '&' + columnsTable[key].name + '=' + value; } }); } // Generic Searching if (searchText !== "" && searchText !== null) { url += '&search=' + searchText; } return new Promise((resolve, reject) => { axios .get(url) .then(response => { resolve({ data: response.data.results, page: page, total: response.data.count, }); }).catch(function (error) { resolve({ data: [], page: 0, total: 0, }); }); }); }; sort = (page, sortOrder, filter) => { this.setState({ isLoading: true }); this.axiosRequest(this.state.urlApi, page, sortOrder, filter).then(res => { this.setState({ data: res.data, page: res.page, sortOrder, filter, isLoading: false, count: res.total, }); }); }; changePage = (page, sortOrder, filter) => { this.setState({ isLoading: true, }); this.axiosRequest(this.state.urlApi, page, sortOrder, filter).then(res => { this.setState({ isLoading: false, page: res.page, sortOrder, filter, data: res.data, count: res.total, }); }); }; filterChange = (page, sortOrder, filter) => { this.setState({ isLoading: true, }); this.axiosRequest(this.state.urlApi, page, sortOrder, filter).then(res => { this.setState({ isLoading: false, page: res.page, sortOrder, filter, data: res.data, count: res.total, }); }); }; searchTable = (page, sortOrder, columnsFilter, searchText) => { this.setState({ isLoading: true, }); this.axiosRequest(this.state.urlApi, page, sortOrder, columnsFilter, searchText).then(res => { this.setState({ isLoading: false, page: res.page, sortOrder, filter: columnsFilter, search: searchText, data: res.data, count: res.total, }); }); } render() { const { data, count, isLoading, rowsPerPage, sortOrder } = this.state; const options = { filter: true, filterType: 'dropdown', responsive: 'vertical', serverSide: true, download: false, count: count, rowsPerPage: rowsPerPage, rowsPerPageOptions: [], sortOrder: sortOrder, resizableColumns: false, confirmFilters: true, onTableChange: (action, tableState) => { switch (action) { case 'changePage': this.changePage(tableState.page, tableState.sortOrder, tableState.filterList); break; case 'sort': this.sort(tableState.page, tableState.sortOrder, tableState.filterList); break; case 'search': this.searchTable(tableState.page, tableState.sortOrder, tableState.filterList, tableState.searchText); break; default: console.log('[' + action + '] action not handled.'); } }, setTableProps: () => { return { size: this.state.denseTable ? 'small' : 'medium' }; }, }; return ( <div className="w-full flex flex-col"> <MUIDataTable title={ <Typography variant="h6"> Listing {isLoading && <CircularProgress size={24} />} </Typography> } data={data} columns={this.state.columns} options={options} /> </div> ); } } export default CadcliContent;

发生了什么:

无论如何,我更改父组件中的状态,例如,输入textfield并更改this.state.formdata.name属性,或单击按钮打开模态(更改this.state.dialog)mui datatables的OntableChange函数,并在我的桌子上触发并生成一个处理,我意识到,我意识到console.gon.to console。

onTableChange: (action, tableState) => { switch (action) { /* .... */ default: console.log('[' + action + '] action not handled.'); } },

(从触发console.log的代码中摘录)

这扰乱了我,因为Mui-dataitable知道它在此改变了某些东西。 任何想知道会发生什么?enter image description here

解决方案比我想象的要简单,我最终通过研究和理解反应状态概念来解决它。
十,尽管我仍然不明白MUI-datables组件如何观察整个状态,但将对话框封装在新组件中的简单事实,具有新的隔离状态,但魔术发生了。

,如果有人遇到同样的问题,解决方案就是这样:

cadclifield.js

javascript reactjs mui-datatable
1个回答
0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.