reactjs 当对象似乎已定义时,无法显示对象属性(React)

snz8szmq  于 2023-02-22  发布在  React
关注(0)|答案(3)|浏览(154)

我在MERN堆栈应用程序中有一些代码,用户可以在搜索栏中输入另一个用户的名称,网页将返回他们搜索到的用户名称的其他属性。
例如,如果我在搜索栏中向上搜索"John Doe",它应该在前端返回如下内容:

Name: John Doe
Age: 30
Sex: Male

下面是我为React组件编写的代码:

import React, { useState, useEffect } from "react";
import axios from "axios";
import "../../styles/styles.css";

function SearchUser() {
  const [user, setUser] = useState({});
  const [searchQuery, setSearchQuery] = useState("");
  const [formError, setFormError] = useState(false);

  async function getUsers(query) {
    const response = await axios.get(`http://localhost:5000/auth/userSearch?fullName=${query}`);
    setUser(response.data);
  }

  const handleSubmit = async (e) => {
    e.preventDefault();

    if (!searchQuery) {
      setFormError(true);
      return;
    }

    setFormError(false);
    getUsers(searchQuery);
  };

  useEffect(() => {
    console.log(user);
  }, [user]);

  return (
    <div className="container">
      <div className="create-profile-border">
        <h1>Search a user</h1>
        <form onSubmit={handleSubmit}>
          <div>
            <input
              type="text"
              placeholder="Enter a user's full name here"
              onChange={(e) => {
                setSearchQuery(e.target.value);
              }}
              value={searchQuery}
            />
            {formError && !searchQuery && (
              <p className="error-message">This is a required field</p>
            )}
          </div>
          <button className="create-profile-button" type="submit">
            Search
          </button>
        </form>

        {user.fullName > 0 && (
          <div>
            <p>Name: {user.fullName}</p>
            <p>Age: {user.age}</p>
            <p>Sex: {user.sex}</p>
          </div>
        )}
      </div>
    </div>
  );
}

export default SearchUser;

我已经检查并确认后端代码工作正常,问题纯粹在于前端。

    • 我的问题:**

在调试和一些控制台日志记录之后,似乎user. fullName/user. age/user. email都未定义。但是,在此控制台日志中:

useEffect(() => {
    console.log("effect[user]:", JSON.stringify(user));
  }, [user]);

当我在搜索栏中键入"John Doe"时,在浏览器控制台中返回一个用户对象:

effect[user]: {"user":{"_id":"63eea67c0316be96ebf799f0","email":"johndoe@example.com","passwordHash":"DU7fwnIlucrwT7R","fullName":"John Doe","age":"30","sex":"male","__v":0}}

我怀疑有一些有趣的业务与渲染,但由于我仍然没有经验的React,我不知道从这里去。任何帮助将不胜感激。

fkvaft9z

fkvaft9z1#

我同意phil的所有建议。但是,在查看控制台的日志后,我认为您的数据是作为用户返回的。因此,您应该能够通过将user设置为response.data.user来获取数据

async function getUsers(query) {
    const response = await axios.get(`http://localhost:5000/auth/userSearch?fullName=${query}`);
    setUser(response.data.user);
  }

const getUsers = async (fullName) => {
  setUser(
    (
      await axios.get("/auth/userSearch", {
        baseURL: "http://localhost:5000/", // even better, use your .env file
        params: { fullName },
      })
    ).data.user
  );
};
kyxcudwk

kyxcudwk2#

你能分享你的API的完整JSON响应吗?我这么问是因为你粘贴的内容 * 看起来 * 像是在暗示响应看起来像这样:

{
  user: { _id: "...", email: "...", passwordHash: "..." },
  _id: "63eea67c0316be96ebf799f0"
  fullName: "John Doe"
​​  age: "30"
}

换句话说...根据您的粘贴,data.user对象不包含fullName属性,而data.fullName包含该属性。

efzxgjgh

efzxgjgh3#

您的主要问题是尝试将string属性user.fullName与数值0进行比较。除非字符串是纯数值,否则user.fullName > 0将始终为false
不要将user初始化为空对象,尝试用null启动它,这样就可以更容易地测试它是否有值...

const [user, setUser] = useState(null);

// ...

{user && (
  <div>
    <p>Name: {user.fullName}</p>
    <p>Age: {user.age}</p>
    <p>Sex: {user.sex}</p>
  </div>
)}

您可以做的另一个改进是使用Axios的params选项来正确编码URL查询参数。

  • 更新:* 在提示您调试自己的API响应后,您的响应数据似乎也嵌套在user属性下
const getUsers = async (fullName) => {
  setUser(
    (
      await axios.get("/auth/userSearch", {
        baseURL: "http://localhost:5000/", // even better, use your .env file
        params: { fullName },
      })
    ).data.user // 👈 extract the `user` property
  );
};

相关问题