Почему при входе в систему с пустой корзиной покупок появляется ошибка .map? - PullRequest
0 голосов
/ 08 июля 2019

Я работаю над проектом электронной коммерции с React.После того, как я выбрал продукты и хочу увидеть их в корзине, мне просто нужно войти в систему, чтобы увидеть продукты внутри корзины.Все хорошо, если корзина заполнена, но если я пытаюсь войти в систему с пустой корзиной, она выдает мне следующую ошибку: «Ошибка типа: Невозможно прочитать свойство 'map' of null" Используемые компоненты:

//SignInForm.js
export default class SignInForm extends React.Component{
constructor(props){
    super(props);
    this.state={
        username: '',
        password: '',
        error: null
    }
    this.handleChange= this.handleChange.bind(this);
    this.handleSubmit= this.handleSubmit.bind(this);
  }
  handleChange(e){
    let target = e.target;
    let value = target.type === 'checkbox' ? target.checked : target.value;
    let name = target.name;
    this.setState({
      [name]: value,
      error: null
    });
  }
  handleSubmit(e){
    e.preventDefault();
    console.log('The form was submitted with the following data:');
    console.log(this.state);
    const user = {
      email: this.state.username,
      password: this.state.password
    }
    axios.post(`https://reqres.in/api/login`, user)
    .then(res => {
      console.log(res);
      console.log(res.data);
      localStorage.setItem('user', res.data.token);  
        this.props.history.push('/Shopping')
      })    
  };
  render(){
    return(
      <div>              
        <form onSubmit={this.handleSubmit}>                
           <span>Username</span>                    
              <FormGroup controlId="username" bsSize="large">            
                <FormControl
                   type='text'
                   name="username"
                   placeholder='Email'
                   value={this.state.email}
                   onChange={this.handleChange}                        
                 />
               </FormGroup>                 
            <span>Password</span>                    
              <FormGroup controlId="password">            
                 <FormControl
                   type='password'
                   value={this.state.password}
                   onChange={this.handleChange}
                   name="password"
                   placeholder='Password'                                           
                 />
              </FormGroup>                  
           <Button type="submit">
            Login
            </Button>
                {
                  this.state.error !== null ? 
                  <div>
                    {this.state.error}
                  </div>
                  : ''
                }
              </form>
         </div>
    )
  }
}
withRouter(SignInForm);
NavLink(SignInForm);

//Shopping.js, the error is reported in this file
class Shopping extends Component{ 
    componentDidMount(){
        const products =  JSON.parse(localStorage.getItem('products'));
        this.setState({products});    
    }
    render(){
        const products =  JSON.parse(localStorage.getItem('products'));        
        return(
            <div >                 
                {products.map((product, key) =>
                  <CartProduct key={key} data={product}/> 
                 )}                                            
            </div>
        )
    }
}
export default Shopping;

//CartProduct.js
class CartProduct extends React.Component{   
    render(){   
        return(
        ( localStorage.getItem('products') !== null) ? (                   
            <> 
            <Row>
                <Col>
                    <img 
                        src={this.props.data.img}                       
                    />
                </Col>
                <Col>
                    <h4>{this.props.data.name}</h4>
                    <span>{this.props.data.description}</span>
                    <h4>${this.props.data.price}</h4>
                </Col>
                <Col>
            </>
            ):(
                <span>Your cart is empty!</span>
            )
        )
    }
}
export default withRouter(CartProduct);  

1 Ответ

2 голосов
/ 08 июля 2019

Вам необходимо вернуть пустой массив, если продуктов нет:

const products =  JSON.parse(localStorage.getItem('products '));

должно стать:

 const products =  JSON.parse(localStorage.getItem('products')) || [];
...