- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 ReactJS@15 项目中,unmount setState change warning 出现问题,但组件已经挂载。
这是应用程序结构:
/app
/container
/veil
/router
/routed-view
/other-routed-view
我还有一个“veil manager class”,它以这种方式触发附加到 veil 组件的“_toggle”事件:
componentDidMount()
{
VeilManager.i().on('toggle', this._toggle.bind(this));
}
_toggle(payload = {})
{
const { veil = false, cb } = payload;
this.setState({ isOpen: veil }, cb);
}
然后从路由 View 触发以下代码:
componentDidMount()
{
VeilManager.i().toggle(this._otherFunc.bind(this));
}
在调试流程中,当事件被触发时,Veil 组件被标记为未安装,但根本没有任何意义,因为容器已经注册到其子组件。
此外,Veil 组件会按预期使用react,因此当 VeilManager 状态更改时,Veil 会切换进出。
有什么建议吗?
扩展代码:
// Veil.js
import { background, logo, veil } from './Styles';
import React, { Component } from 'react';
import VeilManager from './Manager';
export default class Veil extends Component
{
constructor(props)
{
super(props);
this.state = {
isOpen: false
};
}
componentDidMount()
{
VeilManager.i().on('toggle', this._toggle.bind(this));
}
_toggle(payload = {})
{
const { veil = false, cb } = payload;
this.setState({ isOpen: veil }, cb);
}
/**
* @override
*/
render()
{
const { isOpen = false } = this.state;
return (
<div style={veil(isOpen)} className="veil-wrapper">
<div style={logo} className="veil-wrapper__logo"/>
<div style={background}/>
</div>
);
}
}
// VeilManager.js
const { EventEmitter } = require('events');
/**
* VeilManager singleton reference
* @type {null}
*/
let $iManager = null;
/**
* Handles the status of veil
* @class veil.Manager
* @extends EventEmitter
*/
export default class Manager extends EventEmitter
{
/**
* @constructor
*/
constructor()
{
super();
this.isOpen = false;
}
/**
* Toggles "isOpen" status
* @param {null|Function} cb To execute after toggling
*/
toggle(cb = null)
{
this.isOpen = !this.isOpen;
this.emit('toggle', { veil: this.isOpen, cb });
}
/**
* Returns the singleton instance of VeilManager
* @return {null|Manager} Singleton instance
*/
static i()
{
$iManager = $iManager || new Manager();
return $iManager;
}
}
//Container.js
import 'react-s-alert/dist/s-alert-css-effects/slide.css';
import 'react-s-alert/dist/s-alert-default.css';
import { Redirect, Route, Switch } from 'react-router-dom';
import React, { Component } from 'react';
import Alert from 'react-s-alert';
import Aside from '@/components/Aside';
import Header from '@/components/Header';
import token from '@/orm/Token';
import Sidebar from '@/components/Sidebar';
import Veil from '@/components/Veil';
// VIEWS
import Clients from '../../views/Clients/';
import Dashboard from '@/views/Dashboard';
export default class Full extends Component
{
/**
* @override
*/
render()
{
return (
<div className="app">
<Header />
<div className="app-body">
<Sidebar {...this.props}/>
<main className="main">
<Veil/>
<div className="container-fluid">
{ token.hasExpired()
? <Redirect to="/login"/>
: <Switch>
<Route path="/dashboard" name="Dashboard" component={Dashboard}/>
<Route path="/clients" name="Clients" component={Clients}/>
<Redirect to="/dashboard"/>
</Switch>
}
</div>
</main>
<Aside />
</div>
<Alert stack={{ limit : 3 }} />
</div>
);
}
}
//Clients.js
import React, { Component } from 'react';
import onFetch from '@/mixins/on-fetch';
/**
* Clients view.
*/
export default class ClientsIndex extends Component
{
/**
* @constructor
*/
constructor(props)
{
super(props);
this._onFetch = onFetch;
}
/**
* @override
*/
componentDidMount()
{
this._onFetch();
}
/**
* @override
*/
render()
{
return (
<div className="animated fadeIn">
<div className="row">
...
</div>
</div>
);
}
}
//mixin/on-fetch
import VeilManager from '@/components/Veil/Manager';
export default (cb = null) => {
debugger;
VeilManager.i().toggle(cb);
};
最佳答案
解决方案:
正如评论中指出的那样,存在冒泡事件和状态传播的问题。
所做的更改:
// Veil manager
...
toggle(cb = null)
{
this.isOpen = !this.isOpen;
const detail = { veil: this.isOpen, cb };
window.dispatchEvent(new CustomEvent('veil-toggle', { bubbles: false, detail }));
}
...
// Veil
...
/**
* @override
*/
constructor(props)
{
super(props);
this.state = {
open: false
};
}
/* istanbul ignore next */
componentWillReceiveProps(next)
{
const open = next && !!next.open;
this.setState({ open });
}
/**
* @override
*/
render()
{
return (
<div style={veil(this.state.open)} className="veil-wrapper">
<div style={logo} className="veil-wrapper__logo"/>
<div style={background}/>
</div>
);
}
...
// Container
...
componentDidMount()
{
window.addEventListener('veil-toggle', this._toggleVeil.bind(this));
}
_toggleVeil(e)
{
this.setState({ veil: e.detail.veil }, e.detail.cb);
}
render()
{
...
<Veil open={this.state.veil}/>
...
}
...
关于javascript - 卸载 setState 警告,即使组件已安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57786738/
1.使用start-all.sh启动hadoop服务时,提示输入 您确定要继续连接吗(是/否) 当我通过脚本启动它时如何抑制这个提示,现在我正在使用期望模块,但我认为可能有一种更简单的方法来做到这一点
我安装了在 Ubuntu 12.04 下运行的 Geonode R 2.01。我尝试使用以下命令卸载它: sudo apt-get remove --purge geonode sudo apt-ge
假设我有 AppDomainA,它启动 AppDomainB。 AppDomainB 然后启动 AppDomainC。 如果在 AppDomainA 中卸载 AppDomainB,AppDomainC
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我尝试使用以下命令从我的 Ubuntu 中卸载 NGinX: sudo apt-get remove nginx-core nginx-full nginx-light nginx-extras n
我已经从 /Applications/ 中删除了 MacVim目录,但当我输入 vim 时在终端中显示错误:no such file or directory: /Applications/MacVi
我的页面中有一个 iframe,该 iframe 嵌入了一个不在我的服务器上的网站。 我正在寻找一种在 iframe 重定向之前触发函数的方法。例如,当用户单击 iframe 内的链接并且 ifram
看来我被 Visual Studio 的 Atomineer Pro 文档加载项挟持了!试用期结束了,我没有用了!但现在每次我在 Visual Studio 中做某事时,我都会收到一条错误消息并发送到
我有一个使用 WiX 完成的安装程序。安装完成后,它会启动一个应用程序,在 Explorer 进程中注入(inject)一些代码。 目前,当我卸载时,重新启动管理器会启动并关闭我的应用程序和资源管理器
在我的网络应用中,我需要在用户离开页面之前发送他们更改的最新数据。 我在页面卸载时调用这样的函数: window.onbeforeunload=sendData; 这就是函数内部调用的内容 funct
我使用 jQuery 和 history.js 来管理部分页面之间的动态转换;这样我就可以避免重新加载整个文档。其中一些部分页面调用自己独特的 javascript 文件。虽然页面之间的转换运行良好,
我需要处理应用程序包的变化,我这样写我的 mainfest mainfest.xml 我的接收器类
我目前在使用大量内存方面遇到了麻烦,我正在尽一切努力削减和优化涉及内存的代码...目前我的游戏的大部分 Nib 文件都加载了所有它在 ViewDidLoad 中的变量,现在我的问题是,在我的 view
如何从系统中删除 composer Php Dependecny Manager? 它说卸载无法继续,因为以下应用程序正在使用需要删除的文件。 Windows 资源管理器 最佳答案 我遇到了同样的问题
所以我使用 stow 在服务器上安装了 Python 2.7.1 源代码 .我过去很粗心,在处理源代码安装时我试图保持井井有条。所以,输入 stow。现在我使用 wget 安装了 easy_insta
有谁知道如何卸载 MacRuby?我在使用 RubyCocoa 然后决定试用 MacRuby,在安装 MacRuby 之后,RubyCocoa 已经停止工作。所以我想删除 MacRuby,但我找不到任
我无法从 64 位 EC2 卸载 mongo。在/usr/bin 我有 mongo 和 mongod 等等。当我从任何地方键入 mongo 时,它会在 1.8 版打开 shell。我现在下载了 2.0
本文实例讲述了Android编程实现监控apk安装,卸载,替换的方法。分享给大家供大家参考,具体如下: ?
1说明 mysql++是mysql开发团队为OO编程提供的C++开发库,是对mysql提供的底层数据存取API进行的C++封装,用其手册上的说法是:复杂而又庞大,当然功能也更强大。 Mysql+
自从我开始建立我的网站那天起,我安装了很多包,有时是为了测试一堆代码,有时是为了项目本身(后来我发现这不是需要的包)。但是现在,当我运行 pip freeze 时,我有一个包列表,我很难卸载不使用的包
我是一名优秀的程序员,十分优秀!