如何将React.Componment作为服务使用
如何将React.Componment作为服务使用
遇到的问题:
在NextJs中,当通过Axios请求数据时,如何监听并提供一个方法,在请求是显示loading
组件,请求结束后若有错误,则弹窗 Error -Toast
解决思路:
在App.js中增加(或追加一个<div />
)=>对该<div />
追加相应的展示组件=>通过show:boolean=false
控制其展示和隐藏,在Axios请求数据时,通过拦截,执行该组件的Start
=>show=true
,请求结束后,执行该组件的Stop
=>show=false
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import ReactDOM from 'react-dom';
import './progress.less'
let defaultState = {show:false}
class Progress extends Component {
constructor(props, context){
super(props, context)
this.state = {...defaultState}
}
start(){ // 开始显示
this.setState({
show:true
})
}
done(){ // 结束隐藏
this.setState({
show:false
})
}
render(){
return (
<div className="myprogress" style={this.state.show? {display:'block'}:{display:'none'}}>
<div className="bar">
<div className="peg"></div>
</div>
<div className="spinner">
<div className="spinner-icon"></div>
</div>
</div>
)
}
}
// 创建元素追加到body
let div = document.createElement('div');
let props = {
};
document.body.appendChild(div);
let Box = ReactDOM.render(React.createElement(
Progress,
props
),div);
export default Box;
import axios from 'axios'
import MProgress from '@/components/progress'
// 设置超时时间
axios.defaults.timeout = 10000
axios.interceptors.request.use(config=>{ // 请求之前加loading
MProgress.start();
return config
},error=>{
return Promise.reject(error)
})
axios.interceptors.response.use(config=>{ // 响应成功关闭loading
MProgress.done();
return config
},error=>{
return Promise.reject(error)
})
export default axios;
然后发现了个问题
document is not defined
document是浏览器客户端的东西,NextJs服务器渲染根本不认识
一度造成尴尬局面
//先判断是否为客户端环境
var canUseDom = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
if (lazy && canUseDom) {
containerDomNode = document.createElement('div');
document.body.appendChild(containerDomNode);
render(React.createElement(ToastContainer, containerConfig), containerDomNode);
}
只有当能读取window
&document
的时候,在继续插入(document.createElement('div')
)来避免服务器报错
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭