通过 localStorage 将状态变量传递给子组件
Passing state variable to child component via localStorage
我正在尝试通过 localStorage 将包含访问令牌的状态变量 'atoken' 传递给子组件 'Home',但是当我尝试时,localStorage.getItem(this.props.atoken) 在 'Home' 组件中,未定义的值将显示在控制台中。如何正确地将此状态变量(atoken)从 'App' 组件传递到 'Home' 组件?
import React, { Component } from 'react';
import Playlist from './components/playlist';
import Home from './components/Home';
import {
BrowserRouter as Router,
Route,
} from 'react-router-dom';
var Spotify = require('spotify-web-api-js');
var spotifyApi = new Spotify();
class App extends Component {
constructor(props){
super(props);
const params = this.getHashParams(); //tokens saved here
const token = params.access_token;
if (token) {
spotifyApi.setAccessToken(token);
}
this.state = {
loggedIn: token ? true : false,
atoken: token, //access token
};
window.localStorage.setItem(this.state.atoken, spotifyApi.getAccessToken());
console.log(window.localStorage.getItem(this.state.atoken));
}
getHashParams() { //uses authenticated users refresh and access token
var hashParams = {};
var e, r = /([^&;=]+)=?([^&;]*)/g,
q = window.location.hash.substring(1);
e = r.exec(q)
while (e) {
hashParams[e[1]] = decodeURIComponent(e[2]);
e = r.exec(q);
}
return hashParams;
}
render() {
return (
<Router>
<div className='App'>
<Route exact path = '/' component= {Home}/>
<Route path= '/playlist' component = {Playlist}/>
</div>
</Router>
);
}
}
export default App;
在 class 'Home' 中,状态变量 'atoken' 未从父组件 'App' 检索访问令牌。
import React, { Component } from 'react';
import './App.css';
var Spotify = require('spotify-web-api-js');
var spotifyApi = new Spotify();
class Home extends Component {
constructor(props){
super(props);
this.state = {
year: ' ',
atoken: window.localStorage.getItem(this.props.atoken), //access token
};
console.log(this.state.atoken);
this.handleSubmit = this.handleSubmit.bind(this);
this.updateInput = this.updateInput.bind(this);
}
handleSubmit(event){
alert("Year Submitted");
this.props.history.push({
pathname: '/playlist',
state: {year: this.state.year, atoken: this.state.atoken},
});
event.preventDefault();
}
updateInput(event){
this.setState({year : event.target.value})
}
render() {
return (
<div id="body" className="Home">
<div>
<form onSubmit={this.handleSubmit}>
<input id = "yearInput" autoComplete="off" type="text" placeholder = "Enter Year" onChange={this.updateInput} />
</form>
</div>
<div id ="logout">
<a href='http://localhost:8888' >
<button id="logout_btn"> Logout </button>
</a>
</div>
</div>
);
}
}
export default Home;
所以问题在于您尝试使用本地存储的方式。设置本地存储时,它需要两个变量。第一个是您要存储的项目的唯一名称,第二个是值。因此,当您调用 setItem 时,它应该是 localStorage.setItem('name',value)
。现在您正在尝试将两个单独的令牌传递给存储。你会做的。
window.localStorage.setItem('mySpotifyToken', spotifyApi.getAccessToken())
window.localStorage.setItem('otherTokenName', this.state.atoken)
然后您可以在家中 class 通过调用以下方式访问它们:
window.localStorage.getItem('mySpotifyToken')
window.localStorage.getItem('otherTokenName')
在您的 class 主页中,您正在调用 this.props.atoken,但您没有通过 props 传递任何内容,因此它将是未定义的。
https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
我正在尝试通过 localStorage 将包含访问令牌的状态变量 'atoken' 传递给子组件 'Home',但是当我尝试时,localStorage.getItem(this.props.atoken) 在 'Home' 组件中,未定义的值将显示在控制台中。如何正确地将此状态变量(atoken)从 'App' 组件传递到 'Home' 组件?
import React, { Component } from 'react';
import Playlist from './components/playlist';
import Home from './components/Home';
import {
BrowserRouter as Router,
Route,
} from 'react-router-dom';
var Spotify = require('spotify-web-api-js');
var spotifyApi = new Spotify();
class App extends Component {
constructor(props){
super(props);
const params = this.getHashParams(); //tokens saved here
const token = params.access_token;
if (token) {
spotifyApi.setAccessToken(token);
}
this.state = {
loggedIn: token ? true : false,
atoken: token, //access token
};
window.localStorage.setItem(this.state.atoken, spotifyApi.getAccessToken());
console.log(window.localStorage.getItem(this.state.atoken));
}
getHashParams() { //uses authenticated users refresh and access token
var hashParams = {};
var e, r = /([^&;=]+)=?([^&;]*)/g,
q = window.location.hash.substring(1);
e = r.exec(q)
while (e) {
hashParams[e[1]] = decodeURIComponent(e[2]);
e = r.exec(q);
}
return hashParams;
}
render() {
return (
<Router>
<div className='App'>
<Route exact path = '/' component= {Home}/>
<Route path= '/playlist' component = {Playlist}/>
</div>
</Router>
);
}
}
export default App;
在 class 'Home' 中,状态变量 'atoken' 未从父组件 'App' 检索访问令牌。
import React, { Component } from 'react';
import './App.css';
var Spotify = require('spotify-web-api-js');
var spotifyApi = new Spotify();
class Home extends Component {
constructor(props){
super(props);
this.state = {
year: ' ',
atoken: window.localStorage.getItem(this.props.atoken), //access token
};
console.log(this.state.atoken);
this.handleSubmit = this.handleSubmit.bind(this);
this.updateInput = this.updateInput.bind(this);
}
handleSubmit(event){
alert("Year Submitted");
this.props.history.push({
pathname: '/playlist',
state: {year: this.state.year, atoken: this.state.atoken},
});
event.preventDefault();
}
updateInput(event){
this.setState({year : event.target.value})
}
render() {
return (
<div id="body" className="Home">
<div>
<form onSubmit={this.handleSubmit}>
<input id = "yearInput" autoComplete="off" type="text" placeholder = "Enter Year" onChange={this.updateInput} />
</form>
</div>
<div id ="logout">
<a href='http://localhost:8888' >
<button id="logout_btn"> Logout </button>
</a>
</div>
</div>
);
}
}
export default Home;
所以问题在于您尝试使用本地存储的方式。设置本地存储时,它需要两个变量。第一个是您要存储的项目的唯一名称,第二个是值。因此,当您调用 setItem 时,它应该是 localStorage.setItem('name',value)
。现在您正在尝试将两个单独的令牌传递给存储。你会做的。
window.localStorage.setItem('mySpotifyToken', spotifyApi.getAccessToken())
window.localStorage.setItem('otherTokenName', this.state.atoken)
然后您可以在家中 class 通过调用以下方式访问它们:
window.localStorage.getItem('mySpotifyToken')
window.localStorage.getItem('otherTokenName')
在您的 class 主页中,您正在调用 this.props.atoken,但您没有通过 props 传递任何内容,因此它将是未定义的。
https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage