提问人:Jonathan Buso 提问时间:8/21/2023 更新时间:8/21/2023 访问量:30
遍历 i18next JSON 文件以映射类组件中的数据
Iterate through an i18next JSON file to map data in a Class Component
问:
我一直在尝试将代码从手动设置的数据重构为通过 JSON 文件进行映射,更具体地说是使用 i18next 进行翻译。
代码如下所示:
constructor(props) {
super(props)
var p1 = <Product
img={ImageTruth}
position={0}
title={'title'}
text={'text'}
isBought={false}
id={1}
handleRemove={this.handleRemove}
/>
var p2 = <Product
img={ImageLies}
position={3}
title={'title'}
text={text'}
isBought={false}
id={2}
handleRemove={this.handleRemove}
/>
var p3 = ...
products.push (p1, p2, p3, p4, p5, p6)
var selectedProduct = p1
this.state = {
products: products,
selectedProduct: selectedProduct,
bought: [],
touchStartX: null,
touchEndX: null,
isOpen: false,
}
这是我替换它的内容:
// pulling Object from translations
var products_t = t('pulsesInfos', { ns: 'cards', returnObjects: true })
if (Object.values(products_t)[0]['text'] !== undefined) {
// mapping through translations array of Objects
Object.values(products_t).map(productItem => {
const img1 = require('../img/pulses/' + productItem.image)
const product = (
<Product
img={img1}
position={0}
title={productItem.title}
text={productItem.text}
isBought={false}
id={productItem.id}
handleRemove={this.handleRemove}
/>
)
// adding to the array for render
products.push(product)
if( productItem.id == 1 ){
this.state = { selectedProduct: product }
// setting selectedProduct with currrent one in loop if id=1
}
})
}
this.state = {
products: products,
selectedProduct: selectedProduct, // when leaving this line, right side argument shows undefined
bought: [],
touchStartX: null,
touchEndX: null,
isOpen: false,
}
但是,它返回:'Failed to Compile' : selectedProduct is undefined.
对于上下文,有一些控件(左侧和右侧)允许用户更改所选产品并将其添加到购物车。
是范围错误吗?还是我错过了什么?谢谢。
答:
-1赞
Ugur Tas
8/21/2023
#1
您遇到的问题似乎与操作的范围和顺序有关。在重构的代码中,您尝试在定义 selectedProduct 变量之前使用它。错误消息“selectedProduct is undefined”清楚地表明了此问题。
若要解决此问题,需要确保在状态初始化中使用 selectedProduct 变量之前已正确定义该变量。以下是执行此操作的方法:
// pulling Object from translations
var products_t = t('pulsesInfos', { ns: 'cards', returnObjects: true });
// Define the variables outside the loop
var products = [];
var selectedProduct = null; // Initialize with null
if (Object.values(products_t)[0]['text'] !== undefined) {
// Mapping through translations array of Objects
Object.values(products_t).map(productItem => {
const img1 = require('../img/pulses/' + productItem.image);
const product = (
<Product
img={img1}
position={0}
title={productItem.title}
text={productItem.text}
isBought={false}
id={productItem.id}
handleRemove={this.handleRemove}
/>
);
products.push(product);
if (productItem.id === 1) {
selectedProduct = product; // Set the selectedProduct variable
}
});
}
// Now define the state after the loop
this.state = {
products: products,
selectedProduct: selectedProduct,
bought: [],
touchStartX: null,
touchEndX: null,
isOpen: false,
};
在此代码中,我已将 products 数组和 selectedProduct 变量的定义移到了循环之外。这可确保在状态初始化中使用 selectedProduct 变量之前,已正确定义该变量。这应该可以解决您面临的“selectedProduct is undefined”问题。
评论
0赞
Jonathan Buso
8/21/2023
谢谢!这确实解决了问题!同时,我注意到组件翻译不会在 languageChange 上更新,尽管我已将其包装在 withTranslation HOC 中,这与所有其他组件相反。有没有办法在languageChange上重新渲染组件?
评论