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}构造函数中的code>和如果(!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} />
);
});
}