React API 发送空白值(某些状态问题)

Posted

技术标签:

【中文标题】React API 发送空白值(某些状态问题)【英文标题】:React API Sends Blank Value (Some State Issue) 【发布时间】:2021-07-13 00:22:07 【问题描述】:

我有一个带有 Validate() 函数的登录表单。我正在尝试将输入值发送到我的 Django 后端,但我收到如下响应。我认为问题在于我正在存储我的数据,例如“input:”,但在 App.js 上我有用户名和密码值。我是 React 的新手,我会吓坏的。我需要这个验证功能。我很困惑。


    "username": [
        "This field may not be blank."
    ],
    "password": [
        "This field may not be blank."
    ]

LoginForm.js(handle_login 是我的 App.js 上的一个函数)

import React from 'react';
import PropTypes from 'prop-types';


class LoginForm extends React.Component 

  constructor() 
    super();
    this.state = 
      input: ,
      iderr: false,
      data: null,
      errors: 
    ;
     
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  


         
  checkgiris = (e, data) => 
    e.preventDefault();
    fetch('http://localhost:8000/token-auth/', 
        method: 'POST',
        headers: 
          'Content-Type': 'application/json'
        ,
        body: JSON.stringify(data)
      )  
      .then(respons => 
        if(respons.status === 200)
         this.props.handle_login(e, this.state.input) 
      
      else 
        this.setState(iderr:true)
       
    )
    
  ;

  handleChange(e) 
    let input = this.state.input;
    input[e.target.name] = e.target.value;
  
    this.setState(
      input
    );
  

 

  handleSubmit(e) 
    e.preventDefault();
  
    if(this.validate())
        console.log(this.state);
        let input = ;
        input["username"] = "";
        input["password"] = "";
        this.setState(input:input);
        this.checkgiris(e, this.state.input) 
    
  

  validate()
    
    let input = this.state.input;
    let errors = ;
    let isValid = true;



    if (!input["username"]) 
      isValid = false;
      errors["username"] = "Username may not blank";
    


    if (!input["password"]) 
      isValid = false;
      errors["password"] = "Password may not blank";
    


    this.setState(
      errors: errors
    );

    return isValid;


  render() 
    return (
     
      <form onSubmit=this.handleSubmit>
        <center><h4>Login</h4></center>
        <div class="girisformu">
        <input
          class="girisid"
          id="username"
          type="text"
          placeholder="Username"
          name="username"
          value=this.state.input.username
          onChange=this.handleChange
        />
         <div className="text-danger">this.state.errors.username</div>
        <input
          class="girispw"
          id="password"
          type="password"
          placeholder="Password"
          name="password"
          value=this.state.input.password
          onChange=this.handleChange
        />
         <div className="text-danger">this.state.errors.password</div>
          this.state.iderr ? <div className="text-danger">Your username or password is invalid.</div> : null 
                <br/>
        <input class="girisyapbuton" type="submit" value="Login" />

        </div>
      </form>
    
      
    );
  


export default LoginForm;

LoginForm.propTypes = 
  handle_login: PropTypes.func.isRequired
;

App.js(我没有分享不必要的代码)

function App() 

  const [displayed_form,setDisplayed_form] = useState('');
  const [username,setUsername] = useState('');
  const [logged_in,setLogged_in] = useState(localStorage.getItem('token') ? true : false);

  useEffect(()=>
    if (logged_in) 
      fetch('http://localhost:8000/api/current_user/', 
        headers: 
          Authorization: `JWT $localStorage.getItem('token')`
        
      )
        .then(res => res.json())
        .then(json => 
          setUsername(json.username);
        );
    
  ,[]) //notice the empty array here


  const handle_login = (e, data) => 
    e.preventDefault();
    fetch('http://localhost:8000/token-auth/', 
      method: 'POST',
      headers: 
        'Content-Type': 'application/json'
      ,
      body: JSON.stringify(data)
    )
      .then(res => res.json())
      .then(json => 
        localStorage.setItem('token', json.token);
        setLogged_in(true);
        setDisplayed_form('');
        setUsername(json.user.username);
      )
      .catch(error => 
        console.log(error)
      )
  ;

  

  const handle_signup = (e, data) => 
  
    e.preventDefault();
    fetch('http://localhost:8000/api/users/', 
      method: 'POST',
      headers: 
        'Content-Type': 'application/json'
      ,
      body: JSON.stringify(data)
    )
      .then(res => res.json())
      .then(json => 
        localStorage.setItem('token', json.token);
        setLogged_in(true);
        setDisplayed_form('');
        setUsername(json.username);
      );

  ;

  const handle_logout = () => 
    localStorage.removeItem('token');
    setLogged_in(false);
    setUsername('');
  ;

  const display_form = form => 
    setDisplayed_form(form);
  ;



  let form;
  switch (displayed_form) 
    case 'login':
      form = <div class="giris"><LoginForm handle_login=handle_login /></div>;
      break;
    case 'signup':
      form = <div class="kayitol"><SignupForm handle_signup=handle_signup /></div>;
      break;
    default:
      form = null;
  

return(
<div className="App">
<div>
bla bla bla .......

【问题讨论】:

【参考方案1】:

我已经删除了这些行

console.log(this.state);
let input = ;
input["username"] = "";
input["password"] = "";
this.setState(input:input);

现在没事了!

【讨论】:

【参考方案2】:

您在调用checkgiris 函数之前重置输入值。我建议您在 API 调用响应或调用 checkgiris 后重置值:

if(this.validate())
  this.checkgiris(e, this.state.input);
  //--> reset input values after this

【讨论】:

我试过但没用 :( 此外,当我尝试随机用户名和密码时,它返回 ""non_field_errors":["Unable to log in with provided credentials."]" 作为响应. 但是当我尝试正确的用户名和密码时,它返回““此字段可能不是空白。”错误。 您是否检查了浏览器中的请求正文是否包含您希望发送的数据?如果答案是肯定的,您应该检查后端。

以上是关于React API 发送空白值(某些状态问题)的主要内容,如果未能解决你的问题,请参考以下文章

react + redux + normalizer:如何发送条件非规范化数据?

阻止禁用和选定的选项在表单中发送空白值

每秒更新来自 api 的消息

无法将数据从 React 发送到 Springboot

使用 react-navigation 时不发送 redux 状态

React Native / Laravel - 向 API 发送请求