开发者问题收集

无法读取以下代码中未定义的属性“split”

2021-02-18
1296

为什么这里的 split 属性未定义?我通过 axios 从我的产品 api 获取产品,我收到了具有一些属性(名称、说明等)的 json 数据

const [product, setProduct] = useState({});
let substrings=[];
  useEffect(() => {
    const getProduct = async () => {
      try {
        const res = await axios.get(`/products/${props.match.params.id}`);
        setProduct(res.data);
     
      } catch (error) {
        console.error(error);
      }
    };
    getProduct();
    //eslint-disable-next-line
  }, []);
  
  const substrings = product.description.split(".");

This is the json that we get from products/id
{"_id":"1","name":"Mangoes","image":"https://drive.google.com/thumbnail?id=1Iq2F4fYxDi7HdX-IJcRuON-CbNuK-pxd","description":"This sweet and fresh mangoes make your day sweet","category":"Fruits","keywords":"fruits","price":120,"countInStock":0,"content":""}

而这里运行正常

const [product, setProduct] = useState({});
const [desc,setDesc]=useState("");
  useEffect(() => {
    const getProduct = async () => {
      try {
        const res = await axios.get(`/products/${props.match.params.id}`);
        setProduct(res.data);
        setDesc(res.data.description);
      } catch (error) {
        console.error(error);
      }
    };
    getProduct();
    //eslint-disable-next-line
  }, []);
  
  const substrings = desc.split(".");

谁能告诉我们为什么会这样?

2个回答

我认为在加载产品之前,您的产品值为 null 或 {}, 因此当您使用 product.description 时,该值将未定义。 您可以使用:

const substrings = (product?.description || '').split(".");
Henry Le
2021-02-18

我认为这里的问题在于您使用 useState 声明 product 的方式。对于第二部分,您直接声明 description ,因此当您拆分它时,它可能是一个空字符串或您声明的任何内容,但不是未定义的。

但对于第一部分,您只声明了 product 变量,没有 description 属性。因此,在获取之前,当您尝试拆分 product.description 时,它是未定义的,并在获取后立即变为一个值。

为了修复它,您可以像这样声明产品:

const [product, setProduct] = useState({ description: "" }) 或者只是简单地使用 ? 运算符,如下所示: const substrings = product.description?.split(".");

此外,可能还存在问题,因为您首先将 substrings 声明为空数组,然后再次将其声明为 const

Topliceanu Razvan
2021-02-18