reactjs - 如何在没有 Redux 的情况下从任何地方更改组件的状态?
问题描述
这是不好的做法吗?
- 从组件中导出状态变化函数
- 从其他文件导入。
- 调用函数改变状态?
通过这种方式,我们可以从任何地方更改某些组件状态。
例如...
我们想Model.js
从任何地方改变状态。
模态.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 />
...
</>
);
某处.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
但是,这些对我来说太复杂了。
解决方案
我发现如果在特殊情况下,我的方式还可以。
特殊情况意味着类似于 customAlert 组件。
在 App 中一次只安装一个 customAlert 组件实例是可以的。
为达到这个...
1.ref
用于访问和更改DOM
2.附加状态更改函数或组件window
并调用window.function
3.我的案例:导出状态更改函数并从其他文件中导入。
这里是如何处理反应上下文 https://next.plnkr.co/edit/EpLm1Bq3ASiWECoE?preview
推荐阅读
- javascript - asnycData 在 NuxtJs 中的页面重新加载上不起作用
- git - GIT在不同分支中具有不同名称的相同文件
- javascript - JavaScript onclick 改变图片并增加计数器
- javascript - EventListener 使用 JS 创建 RGB 调色板的问题
- html - HTML/CSS 网站价格表在笔记本电脑以外的设备上显示带有白线的彩色列
- typescript - 在 Gatsby / Typescript 项目中设置导入别名
- python - 激活 python3 后从服务器上的本地计算机运行 python 脚本
- javascript - 为什么控制台异步返回未定义?
- arrays - 从reactjs中的json数组中选择一个项目
- elasticsearch - Elasticsearch 集群 NodeStatsCollector 收集数据时超时