我有两个组件:
订单 - 获取一些数据并显示它。
ErrorHandler - 如果服务器上发生一些错误,模式将显示并显示一条消息。
ErrorHandler 组件正在扭曲订单组件
我正在使用 axios 包来加载 Orders 组件中的数据,并且我使用 axios 拦截器来设置有关错误的状态,并在组件卸载后弹出。
当我来回导航到订单组件时,有时会在控制台中出现错误:
2 3 4 | in Orders (at ErrorHandler.jsx:40) in Auxiliary (at ErrorHandler.jsx:34) in _class2 (created by Route) |
我试图通过我之前的案例 React 警告来解决它:只能更新已安装或正在安装的组件,但在这里我无法通过检查员制作 axios 令牌。以前有人解决过这个问题吗?
这是我的组件:
订单:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import api from '../../api/api'; import Order from '../../components/Order/Order/Order'; import ErrorHandler from '../../hoc/ErrorHandler/ErrorHandler'; class Orders extends Component { state = { orders: [], loading: true } componentDidMount() { api.get('/orders.json') .then(response => { const fetchedOrders = []; if (response && response.data) { for (let key in response.data) { fetchedOrders.push({ id: key, ...response.data[key] }); } } this.setState({ loading: false, orders: fetchedOrders }); }) .catch(error => { this.setState({ loading: false }); }); } render() { return ( {this.state.orders.map(order => { return (<Order key={order.id} ingrediencies={order.ingrediencies} price={order.price} />); })} ); } } export default ErrorHandler(Orders, api); |
错误处理程序:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import Auxiliary from '../Auxiliary/Auxiliary'; import Modal from '../../components/UI/Modal/Modal'; const ErrorHandler = (WrappedComponent, api) => { return class extends Component { requestInterceptors = null; responseInterceptors = null; state = { error: null }; componentWillMount() { this.requestInterceptors = api.interceptors.request.use(request => { this.setState({ error: null }); return request; }); this.responseInterceptors = api.interceptors.response.use(response => response, error => { this.setState({ error: error }); }); } componentWillUnmount() { api.interceptors.request.eject(this.requestInterceptors); api.interceptors.response.eject(this.responseInterceptors); } errorConfirmedHandler = () => { this.setState({ error: null }); } render() { return ( <Auxiliary> <Modal show={this.state.error} modalClosed={this.errorConfirmedHandler}> {this.state.error ? this.state.error.message : null} </Modal> <WrappedComponent {...this.props} /> </Auxiliary> ); } }; }; export default ErrorHandler; |
我认为这是由于触发 setState 的异步调用,即使组件未挂载也可能发生。为了防止这种情况发生,您可以使用某种标志:
2 3 4 5 6 7 8 9 | isMounted: false } componentDidMount() { this.setState({isMounted: true}) } componentWillUnmount(){ this.state.isMounted = false } |
然后用 if:
package你的 setState 调用
2 3 | this.setState({ loading: false, orders: fetchedOrders }); } |
编辑-添加功能组件示例:
2 3 4 5 6 7 8 9 10 11 12 13 14 | const [isMounted, setIsMounted] = React.useState(false); useEffect(() => { setIsMounted(true); return () => { setIsMounted(false); } }, []); return ; } export default Component; |
您不能在 componentWillMount 方法中设置状态。尝试重新考虑您的应用程序逻辑并将其移至另一个生命周期方法。
我认为根本原因与我昨天回答的相同,您需要"取消"
关于错误处理的说明,它看起来过于复杂,我肯定会鼓励查看 React 提供的 ErrorBoundaries。您不需要
对于 ErrorBoundaries,React 引入了一个生命周期方法,称为:
您可以使用它来将
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch(error, info) { this.setState({ hasError: true, errorMessage : error.message }); } render() { if (this.state.hasError) { return <Modal modalClosed={() => console.log('What do you want user to do? Retry or go back? Use appropriate method logic as per your need.')}> {this.state.errorMessage ? this.state.errorMessage : null} </Modal> } return this.props.children; } } |
然后在你的
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | let cancel; state = { orders: [], loading: true } componentDidMount() { this.asyncRequest = api.get('/orders.json', { cancelToken: new CancelToken(function executor(c) { // An executor function receives a cancel function as a parameter cancel = c; }) }) .then(response => { const fetchedOrders = []; if (response && response.data) { for (let key in response.data) { fetchedOrders.push({ id: key, ...response.data[key] }); } } this.setState({ loading: false, orders: fetchedOrders }); }) .catch(error => { this.setState({ loading: false }); // please check the syntax, I don't remember if it is throw or throw new throw error; }); } componentWillUnmount() { if (this.asyncRequest) { cancel(); } } render() { return ( {this.state.orders.map(order => { return (<Order key={order.id} ingrediencies={order.ingrediencies} price={order.price} />); })} ); } } |
并在你的代码中使用它:
2 3 | <Orders /> </ErrorHandler> |
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我打算为ruby脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳