JavaScript中的对象分配

JavaScript中的对象分配,javascript,reactjs,strapi,Javascript,Reactjs,Strapi,有一个对象产品,其字段为对象制造商。从我的服务器获取manufacturers后,我用一个新数据重新分配产品的字段manufacturer(例如,获取的制造商将其他对象avatar作为其字段) 然后我尝试在React render()中显示化身 这是因为在第一次渲染时,您没有avatar值。这些值是在第一次渲染(componentDidMount)之后获取的 您需要添加一个测试来考虑第一次渲染 此外,您的console.log不一致的原因是您正在覆盖产品的值,为了更不可变,您应该.map而不是f

有一个对象
产品
,其字段为对象
制造商
。从我的服务器获取
manufacturers
后,我用一个新数据重新分配产品的字段
manufacturer
(例如,获取的制造商将其他对象
avatar
作为其字段)

然后我尝试在React render()中显示化身


这是因为在第一次渲染时,您没有
avatar
值。这些值是在第一次渲染(
componentDidMount
)之后获取的

您需要添加一个测试来考虑第一次渲染

此外,您的console.log不一致的原因是您正在覆盖产品的值,为了更不可变,您应该
.map
而不是forEach,并返回产品的副本,而不是修改现有的副本

我将如何写它:

constructor(props){
    super(props);

    this.state = {
        products: []
    }
}

render() {
    return this.state.products.map(product => {
        const {
            avatar = {}
        } = product.manufacturer;
        return (
            <img src={avatar.url} />
        );
    });
}
构造函数(道具){
超级(道具);
此.state={
产品:[]
}
}
render(){
返回此.state.products.map(product=>{
常数{
化身={}
}=产品制造商;
返回(
);
});
}

您正在使用不改变源对象的assign方法进行赋值,结果它返回新对象,请选中此项。 你需要这样做: 产品={ 产品 制造商:您的指定地址 }
主要原因是foreach中的回调函数是异步的,js不会等待所有foreach函数调用完成,它会继续运行,所以使用async word,尝试为此使用Promise,或者最好尝试对异步请求使用actions,感谢Library或sagas。

在记录对象时,不要改变状态,也不要信任控制台输出。另外,您不会返回
this.state={products:null}
如果(!this.state.products)返回null在renderu中更新了构造函数,因此您将始终拥有一个数组。避免了一些测试。我的意思是它只在获取所有数据后才呈现
render() {
    if (!this.state.products) return null;
    return(
        {this.state.products ? this.state.products.map(product => (
            // and it says that avatar is null 
            <img src={product.manufacturer.avatar.url} />

            // displays manufacturer with avatar object
            {console.log(product.manufacturer)}
            // says null! 
            {console.log(product.manufacturer.avatar)}
        ))}
    )
}
strapi.setToken(user.jwt);
      const fetchedProducts = await strapi.getEntries('products');
      const promices = fetchedProducts.map(async fetchedProduct => {
        const manufacturer = await strapi.getEntry('manufacturers', fetchedProduct.manufacturer.id);
        const product = { ...fetchedProduct, manufacturer };

        return product;
      });

      Promise.all(promices).then(products =>
        this.setState({
          products
        })
      );
constructor(props){
    super(props);

    this.state = {
        products: []
    }
}

render() {
    return this.state.products.map(product => {
        const {
            avatar = {}
        } = product.manufacturer;
        return (
            <img src={avatar.url} />
        );
    });
}