reactjs - Reactjs 无法通过映射函数获取 json 数据
问题描述
Reactjs 无法通过映射函数获取 json 数据。
通过显示数组中的 Provision 数据,代码在下面运行良好。当我单击获取新价格时,通过 Axios Json 调用获取新价格,一切正常。
[{"category_id" => "101", "status"=>"1", "category_price" => "900"}]
这是执行此操作的函数。
return {
...store,
category_new: [{
...store.category_new,
category_price: response.data[0].category_price, category_id: response.data[0].category_id
}]
};
这是我渲染它的方式,它可以与上面的函数一起正常工作
{store.category_new && store.category_new.map((cat1) => {
return (
<div key={cat1.category_id}>
<div><b>New Prices:</b> {cat1.category_price} ----- {cat1.category_id}
</div>
</div>
)
})}
这是我的问题 我的问题是我需要通过映射函数来渲染它,所以我创建了它作为替换,但它触发了映射错误。我相信这是导致错误的行
category: store.category_new.map(
这里是地图功能
return {
...store,
category: store.category_new.map(
category => {
if (category.category_id !== pro_id) return category
return { ...category, category_price: response.data[0].category_price, category_id: response.data[0].category_id }
}
)
}
这是整个代码
import React, { Component, Fragment } from "react";
import { render } from "react-dom";
import axios from 'axios';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [],
loading: false
};
}
componentDidMount() {
this.setState({
data: [{
"provision_id":"1",
"provision":"Milk",
"category":[{"category_id":"1", "category_price":"100 USD" }]
}],
});
}
// Get New Price of Milk on button click
handleNewPrice(pro_id) {
alert(pro_id);
const product = {
pro_id: pro_id};
axios
.post("http://localhost/apidb_react/price.json", { product })
.then(response => {
const newData = this.state.data.map(store => {
if (store.provision_id !== pro_id) return store;
return {
...store,
category_new: [{
...store.category_new,
category_price: response.data[0].category_price, category_id: response.data[0].category_id
}]
};
/*
return {
...store,
category: store.category_new.map(
category => {
if (category.category_id !== pro_id) return category
return { ...category, category_price: response.data[0].category_price }
}
)
}
*/
});
this.setState(state => ({
data: newData
}));
console.log(response.data[0].category_price);
})
.catch(error => {
console.log(error);
});
}
render() {
return (
<span>
<label>
<ul>
{this.state.data.map((store) => {
return (
<div key={store.provision_id}>
<div><h1>Provision Store</h1> <br />
<b> Product: </b>{store.provision}
</div>
{store.category_new && store.category_new.map((cat1) => {
return (
<div key={cat1.category_id}>
<div><b>New Prices:</b> {cat1.category_price} ----- {cat1.category_id}
</div>
</div>
)
})}
{store.category && store.category.map((cat) => {
return (
<div key={cat.category_id}>
<div><b>Prices:</b> {cat.category_price}
<br />
<input
type="button"
value="Get New Prices"
onClick={() => this.handleNewPrice(cat.category_id)}
/>
</div>
</div>
)
})}
</div>
)
}
)}
</ul>
</label>
</span>
);
}
}
解决方案
从我的角度来看,您的问题是试图将数组传播到对象(请看下面我在代码中评论过),但我没有机会测试它,因为您没有向我们提供来自http://localhost/apidb_react/price.json
. 所以如果我的修复对你有用——很好,如果不是——请附上模型 json。
import React, { Component, Fragment } from "react";
import { render } from "react-dom";
import axios from "axios";
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
data: [],
loading: false
};
}
componentDidMount() {
this.setState({
data: [
{
provision_id: "1",
provision: "Milk",
category: [{ category_id: "1", category_price: "100 USD" }]
}
]
});
}
// Get New Price of Milk on button click
handleNewPrice(pro_id) {
alert(pro_id);
const product = {
pro_id: pro_id
};
const { data } = this.state;
axios
.post("http://localhost/apidb_react/price.json", { product })
.then(response => {
this.setState({
data: data.map(store => {
if (store.provision_id !== pro_id) {
return store;
} else {
return {
...store,
category_new: [
...store.category_new, // that's fix for #1
{
/**
* problem #1 in line below, you're trying to spread array data 'store.category_new' to object
*/
// ...store.category_new,
/**
* problem #2 I would recommend to make some validation 'response && response.data && response.data[0] && response.data[0].category_price'
*/
category_price: response.data[0].category_price,
category_id: response.data[0].category_id
}
]
}
}
})
})
console.log(response.data[0].category_price);
})
.catch(error => {
console.log(error);
});
}
render() {
const { data } = this.state;
return (
<span>
<label>
<ul>
{
data.map(store => (
<div key={store.provision_id}>
<div>
<h1>Provision Store</h1> <br />
<b> Product: </b>
{store.provision}
</div>
{
store.category_new &&
store.category_new.map(cat1 => {
return (
<div key={cat1.category_id}>
<div>
<b>New Prices:</b> {cat1.category_price} -----{" "}
{cat1.category_id}
</div>
</div>
);
})
}
{
store.category &&
store.category.map(cat => {
return (
<div key={cat.category_id}>
<div>
<b>Prices:</b> {cat.category_price}
<br />
<input
type="button"
value="Get New Prices"
onClick={() =>
this.handleNewPrice(cat.category_id)
}
/>
</div>
</div>
);
})
}
</div>
))
}
</ul>
</label>
</span>
);
}
}
推荐阅读
- azure - Azure Function App 通过应用程序设置使用最新版本的 Key Vault Secret
- sas - sas企业指南中的数据步骤问题
- javascript - 如何在 Angular 中加载图像?
- homebrew - 如何在具有普通管理员用户的 Mac 上安装 brew?
- mysql - MySQL GROUP_CONCAT 和 JOIN
- file-monitoring - 文件和文件夹监控效率
- javascript - 反应 axios 状态一开始不会设置
- laravel - Laravel 7 圣所注销
- swift5 - CoreData 和 Struct 之间的自定义编码/解码
- python-3.x - Python乘以列表的值