【发布时间】:2019-01-31 20:32:40
【问题描述】:
这是不是不好的做法?
- 从组件中导出状态变化函数
- 从其他文件导入。
- 调用函数改变状态?
通过这种方式,我们可以从任何地方更改某些组件状态。
例如...
我们想从任何地方更改Model.js 状态。
Modal.js
import React from 'react';
export let toggleModal;
export default class Modal extends React.Component {
constructor(props) {
super(props);
this.state = {
open: false,
};
toggleModal = this.toggleModal;
}
toggleModal = () => {
this.setState({ open: !this.state.open });
};
render() {
const { open } = this.state;
return <div style={{ color: 'red' }}>{open && 'Hello Modal'}</div>;
}
}
App.js(一些顶级组件)
import React from 'react';
import Modal from './Modal';
export default () => (
<>
...
<Modal />
...
</>
);
Somewhere.js
import React from 'react';
import {toggleModal} from './Modal';
export default () => (
<>
<h1>Hello!</h1>
<button onClick={() => toggleModal()}>open Modal!</button>
</>
);
但是 React 官方文档中没有参考,所以这是不好的做法吗?
React Docs 推荐什么...
- 只需传递函数道具即可将父状态从父状态更改为子状态
- 使用上下文
- Redux 或 Mobx
但是,这些对我来说太复杂了。
【问题讨论】:
-
如果你认为 redux 太复杂,那么你会陷入混乱,直接改变其他组件的状态,随着时间的推移会变得更加复杂。试试 redux,还不错。
-
您不能导出
setState(),因为它绑定到将在运行时创建的组件实例。导入/导出发生在编译时。但是要回答这个问题:是的,将setState()暴露给外部代码通常应该被认为是一种不好的做法。它使您的应用在发展过程中难以推理。 -
您可以在任何地方使用 Redux 更改状态。
标签: reactjs