React Native 无法显示更新的 setState 值
React Native unable to display updated setState value
下面是我的代码:
const ProductData = () => {
const [data, setData] = useState([])
const x = [{"product": {"product_description": "XYZ", "product_name": "Product1"}, "quantity": 1}]
setData(x);
function onChangeQuantity(i, type){
let quant = data[i].quantity;
if (type) {
quant += 1;
data[i].quantity = quant;
setData(data);
console.log(data);
} else if (type === false && quant >= 2) {
quant -= 1;
data[i].quantity = quant;
setData(data);
console.log(data);
} else if (type === false && quant === 1) {
data.splice(i, 1);
setData(data);
}
}
return(
<View>
{data.map((item, index) => (
<View key={index}>
<Text>
{item.product.product_name}
</Text>
</View>
<View style={styles.container4}>
<TouchableOpacity
onPress={() => onChangeQuantity(index, false)}>
<Text> Decrement Value </Text>
</TouchableOpacity>
<Text>{item.quantity}</Text>
<TouchableOpacity
onPress={() => onChangeQuantity(index, true)}>
<Text> Increment Value </Text>
</TouchableOpacity>
</View>
</View>
))}
</View>
)
}
现在面临的问题是 - 每当我点击增量值/减量值时,数量就会更新,但更新后的值不会显示在 return 语句中。按下增量值按钮后的示例控制台日志如下:
[{"product": {"product_description": "Product2", "product_name": "Product2"}, "quantity": 2}]
但是更改没有反映在视图中。单击按钮后如何立即显示更新的数量。请让我知道我哪里出错了。非常感谢。
不要在 React 中改变状态 - 它会导致重新渲染问题。将您的函数更新为不可变版本。
function onChangeQuantity(i, add) {
if (add) {
setData(
data.map((item, j) => i === j ? ({ ...item, quantity: item.quantity + 1 }) : item)
);
return;
}
const curr = data[i];
if (curr.quantity === 0) {
setData(
data.filter((_, j) => i !== j)
);
} else {
setData(
data.map((item, j) => i === j ? ({ ...item, quantity: item.quantity - 1 }) : item)
);
}
}
另一种方法:
function onChangeQuantity(i, add) {
const newObj = { ...data[i], quantity: data[i].quantity + (add ? 1 : -1) };
setData(
data
.map((item, j) => i === j ? newObj : item)
.filter(item => item.quantity)
);
}
问题
您正在改变状态对象。
let quant = data[i].quantity; // <-- reference to state object
if (type) {
quant += 1;
data[i].quantity = quant; // <-- mutation!!
setData(data); // <-- saved same array back to state
console.log(data);
} else if (type === false && quant >= 2) {
quant -= 1;
data[i].quantity = quant; // <-- mutation!!
setData(data); // <-- saved same array back to state
console.log(data);
} else if (type === false && quant === 1) {
data.splice(i, 1); // <-- mutation!!
setData(data);
}
解决方案
你需要浅拷贝状态。将 data
数组 复制到 一个新的数组引用中,然后浅复制您要更新数量的元素。
function onChangeQuantity(i, type){
if (type) {
setData(data => data.map((el, index) => index === i ? {
...el,
quantity: el.quantity + 1,
} : el));
} else if (!type && data[i] >= 2) {
setData(data => data.map((el, index) => index === i ? {
...el,
quantity: el.quantity - 1,
} : el));
} else if (!type && quant === 1) {
setData(data => data.filter((el, index) => index !== i));
}
}
下面是我的代码:
const ProductData = () => {
const [data, setData] = useState([])
const x = [{"product": {"product_description": "XYZ", "product_name": "Product1"}, "quantity": 1}]
setData(x);
function onChangeQuantity(i, type){
let quant = data[i].quantity;
if (type) {
quant += 1;
data[i].quantity = quant;
setData(data);
console.log(data);
} else if (type === false && quant >= 2) {
quant -= 1;
data[i].quantity = quant;
setData(data);
console.log(data);
} else if (type === false && quant === 1) {
data.splice(i, 1);
setData(data);
}
}
return(
<View>
{data.map((item, index) => (
<View key={index}>
<Text>
{item.product.product_name}
</Text>
</View>
<View style={styles.container4}>
<TouchableOpacity
onPress={() => onChangeQuantity(index, false)}>
<Text> Decrement Value </Text>
</TouchableOpacity>
<Text>{item.quantity}</Text>
<TouchableOpacity
onPress={() => onChangeQuantity(index, true)}>
<Text> Increment Value </Text>
</TouchableOpacity>
</View>
</View>
))}
</View>
)
}
现在面临的问题是 - 每当我点击增量值/减量值时,数量就会更新,但更新后的值不会显示在 return 语句中。按下增量值按钮后的示例控制台日志如下:
[{"product": {"product_description": "Product2", "product_name": "Product2"}, "quantity": 2}]
但是更改没有反映在视图中。单击按钮后如何立即显示更新的数量。请让我知道我哪里出错了。非常感谢。
不要在 React 中改变状态 - 它会导致重新渲染问题。将您的函数更新为不可变版本。
function onChangeQuantity(i, add) {
if (add) {
setData(
data.map((item, j) => i === j ? ({ ...item, quantity: item.quantity + 1 }) : item)
);
return;
}
const curr = data[i];
if (curr.quantity === 0) {
setData(
data.filter((_, j) => i !== j)
);
} else {
setData(
data.map((item, j) => i === j ? ({ ...item, quantity: item.quantity - 1 }) : item)
);
}
}
另一种方法:
function onChangeQuantity(i, add) {
const newObj = { ...data[i], quantity: data[i].quantity + (add ? 1 : -1) };
setData(
data
.map((item, j) => i === j ? newObj : item)
.filter(item => item.quantity)
);
}
问题
您正在改变状态对象。
let quant = data[i].quantity; // <-- reference to state object
if (type) {
quant += 1;
data[i].quantity = quant; // <-- mutation!!
setData(data); // <-- saved same array back to state
console.log(data);
} else if (type === false && quant >= 2) {
quant -= 1;
data[i].quantity = quant; // <-- mutation!!
setData(data); // <-- saved same array back to state
console.log(data);
} else if (type === false && quant === 1) {
data.splice(i, 1); // <-- mutation!!
setData(data);
}
解决方案
你需要浅拷贝状态。将 data
数组 复制到 一个新的数组引用中,然后浅复制您要更新数量的元素。
function onChangeQuantity(i, type){
if (type) {
setData(data => data.map((el, index) => index === i ? {
...el,
quantity: el.quantity + 1,
} : el));
} else if (!type && data[i] >= 2) {
setData(data => data.map((el, index) => index === i ? {
...el,
quantity: el.quantity - 1,
} : el));
} else if (!type && quant === 1) {
setData(data => data.filter((el, index) => index !== i));
}
}