javascript - 仅在刷新页面后获取令牌。刷新前token返回null
问题描述
在我尝试调用两个函数的组件Items
中。componentDidMount ()
从 localStorage 获取domain
-> 将域返回给我 -> 没关系。从 localStorage 获取时,token
返回 me null
。只有当我刷新页面时,它才会获得令牌值。
登录
class Login extends Component {
constructor (props) {
super(props);
this.state = {
email: '',
password: '',
token: JSON.parse(localStorage.getItem("token"))
}
}
onSubmit = (event) => {
event.preventDefault();
axios({
method: 'post',
url,
data,
config
})
.then(res => {
const instanceSingle = res.data.instances.map((instance, index) => {
return instance.domain
});
if (res.status === 200) {
this.setState({
instances: res.data.instances
}, this.getDomain(instanceSingle))
}
}).catch(err => {
console.log(err);
});
}
getDomain = (domain) => {
localStorage.setItem('domain', domain);
this.getToken();
}
getToken = () => {
const domain = localStorage.getItem('domain');
const url = '${domain}/oauth2/token';
axios({
method: 'post',
url,
data,
config
})
.then(res => {
if (res.status === 200) {
localStorage.setItem('token', JSON.stringify(res.data['access_token']))
}
}).catch(err => {
console.log(err);
});
}
render () {
const {instances} = this.state;
return (
<div>
{this.state.token || instances.length === 1 ?
<Items
token= {JSON.parse(localStorage.getItem("token"))}
domain={localStorage.getItem('domain')}
instances={this.state.instances}
/>
:
instances.length > 2 ?
<AnotherComponent
/>
:
<form method="post" onSubmit={this.onSubmit}>
<input type="email"
value={this.state.email}
/>
</div>
<input type="password" className="form-control" name="password"
value={this.state.password}
onChange={this.handleUserInput} />
</div>
<button type="submit">Log in</button>
</form>
}
</div>
)
}
}
项目
class Items extends Component {
constructor (props) {
super(props);
this.state = {
items: []
}
}
componentDidMount() {
const token = JSON.parse(localStorage.getItem('token'))
const domain = localStorage.getItem('domain');
axios({
url: `${domain}/api/v1/items`,
method: "GET",
headers: {
'Authorization': `Bearer ${token}`
}
})
.then(response => {
this.setState({
items: response.data
});
this.function2();
this.function1();
})
.catch(error => {
console.log(error);
})
}
render () {
return (
<div>
{this.state.items.map((item, index) =>
<Item
/>
)}
</div>
)
}
}
解决方案
我有三个选择,只需尝试一下:
- 您在调用登录后设置了实例,这意味着在您更改状态时做出反应,渲染将在状态更改后自动调用。这就是为什么
this.state.token || instances.length === 1
即使令牌未设置为状态也会执行您的第二个或条件的原因。并且您的子组件没有从 Login 组件获取令牌值作为道具 - 您已经为 Items 和另一个组件使用了条件组件渲染,这就是为什么它总是安装,即使只有实例字段会在状态中发生变化,这就是为什么同时设置您的
instances
和token
状态而不是两者都在不同的行。 - 如果你不想让你的代码失败,那就放 && 而不是 || 因为从您的代码实例中获得价值,但令牌没有获得价值。并且根据您在 componentDidMount 中的代码,您必须需要令牌,然后为什么要冒令牌的风险变得空,只需放置
&&
而不是||
.
推荐阅读
- python - 单击python我如何从命令行读取json之类的参数
- python - 有什么方法可以获取每只股票(200+)的所有季度业绩数据并使用 python 将其存储在 excel 中?
- azure - 天蓝色数据工厂更新
- testing - 结构动态 TestCafe 运行
- oracle - PLSQL:如何逐行通过游标,将值复制到表中,并在同一个循环中将这些值保存到变量中?
- python - SQLAlchemy 中的反射不适用于 MS SQL Server 系统表?
- android - NetworkOnMainThreadException 对协程中的网络调用有效吗?
- python - 带有两个程序的 gui 类
- owl - 作为 unionOf 的类,但没有其他类不相交
- wordpress - 从另一台服务器重定向 URL