我正在开发一个web应用程序,使用React跟踪水果供应商的库存。js,MongoDB,Node。js和Express。我调用了数据库endpoint来呈现表中的数据。现在,我尝试使用按钮增加和减少库存量,但当我尝试设置新状态时,它不起作用。我尝试通过单击更改状态,然后更新数据库中的新状态。有什么建议吗?
>
可结果成分:
从'react'导入Reac,{Component};从“react bootstrap”导入*作为react bootstrap;从“axios”导入axios;从“反应引导/按钮”导入按钮;
类可结果扩展组件{
constructor(props) {
super(props)
this.state = {
fruits: []
}
this.handleClick = this.handleClick.bind(this)
}
componentDidMount() {
axios.get('http://localhost:5000/fruits/')
.then(res => {
this.setState({
fruits: res.data
});
})
.catch((error) => {
console.log(error)
})
}
handleClick = () => {
const fruits = [...this.state.fruits]
this.setState({fruits: this.state.fruits[1] +1})
}
render() {
return(
<div>
<h1>Fruit Vendor Stock</h1>
<ReactBootstrap.Table striped bordered hover size="sm">
<thead>
<tr>
<th>#</th>
<th>Name</th>
<th>Stock</th>
<th>Price</th>
<th>Add/Reomve</th>
</tr>
</thead>
<tbody>
{
this.state.fruits.map((fruit, index) => (
<tr>
<th scope="row">{index + 1}</th>
<td>{fruit.name}</td>
<td>{fruit.stock}</td>
<td>{fruit.price}</td>
<td>
<div className="mb2">
<Button className="btn btn-primary btn-sm"
onClick={this.handleClick}
>Add</Button>{' '}
<Button className="btn btn-danger btn-sm"
>Remove</Button>
</div>
</td>
</tr>
))
}
</tbody>
</ReactBootstrap.Table>
</div>
)
};
}
导出默认结果表;
弗鲁茨达。模型
const mongoose=require('mongoose');
const Schema=mongoose。图式;
const fruits=newschema({name:{type:String,required:true},stock:{type:Number,required:true},price:{type:Number,required:true},}{
});
常数水果=猫鼬。模型(“果实”,果实);
单元出口=水果;
-路线:
const router = require('express').Router();
let Fruit = require('../models/fruit_data');
router.route('/').get((req, res) => {
Fruit.find()
.then(fruits => res.json(fruits))
.catch(err => res.status(400).json('Error: ' + err));
});
router.route('/add').post((req, res) => {
const name = req.body.name;
const stock = Number(req.body.stock);
const price = Number(req.body.price);
const newFruit = new Fruit({
name,
stock,
price,
});
newFruit.save()
.then(() => res.json('Fruit has been added!'))
.catch(err => res.status(400).json('Error: ' + err));
});
router.route('/:id').get((req, res) => {
Fruit.findById(req.params.id)
.then(Fruit => res.json(Fruit))
.catch(err => res.status(400).json('Error: ' + err));
});
router.route('/:id').delete((req, res) => {
Fruit.findByIdAndDelete(req.params.id)
.then(() => res.json('Fruit has deleted.'))
.catch(err => res.status(400).json("Error: " + err));
});
router.route('/update/:id').put((req, res, next) => {
Fruit.findByIdAndUpdate(req.params.id, {
$set: req.body
}, (error, data) => {
if(error) {
return next(error);
console.log(error)
} else {
res.json(data)
console.log('Stock has been updated')
}
})
})
单元出口=路由器;
-Server.js:
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 5000;
app.use(cors());
app.use(express.json());
const uri = process.env.ATLAS_URI;
mongoose.connect(uri, { useNewUrlParser: true });
const connection = mongoose.connection;
connection.once('open', () => {
console.log("MongoDb database connection established successfully!!")
})
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
const fruitsRouter = require('./routes/fruit');
app.use('/fruits', fruitsRouter);
app.listen(port, () => {
console.log(`Server is running on port: ${port}`);
})
-pp.js:
import "./App.css";
import React, { Component, useState, useEffect } from "react";
import FruitTable from "./Components/fruitTable";
import "bootstrap/dist/css/bootstrap.min.css";
import { sendEmail } from "./service/emailService";
import axios from 'axios';
function App() {
return (
<div className="App">
<FruitTable />
</div>
);
}
导出默认应用程序;
handleClick
中的状态更新不正确,它取第1个元素值,加上1,并将其设置为this。状态水果
状态值。这打破了水果
作为数组的状态不变量。这可能是试图映射您看到的非数组值的“崩溃”。
handleClick = () => {
const fruits = [...this.state.fruits]
this.setState({
fruits: this.state.fruits[1] +1 // <-- mutates state invariant!!
})
}
代码也没有传递它试图更新的索引或结果的引用。
根据您的模式,水果项目有3个属性,名称
,库存
,和价格
。对于此解决方案,我将假定名称
对于识别目的来说是足够唯一的,并且您正在增加/减少库存
数量。
handleClick = (name, addQuantity = 1) => () => {
this.setState(prevState => ({
fruits: prevState.fruits.map(fruit =>
fruit.name === name
? { ...fruit, stock: fruit.stock + addQuantity}
: fruit
)
}));
}
现在,您需要在映射时将当前映射的水果项目的name
属性传递给处理程序。
{this.state.fruits.map((fruit, index) => (
<tr key={fruit.name}>
<th scope="row">{index + 1}</th>
<td>{fruit.name}</td>
<td>{fruit.stock}</td>
<td>{fruit.price}</td>
<td>
<div className="mb2">
<Button
className="btn btn-primary btn-sm"
onClick={this.handleClick(item.name, 1)} // <-- add one
>
Add
</Button>{' '}
<Button
className="btn btn-danger btn-sm"
onClick={this.handleClick(item.name, -1)} // remove one
>
Remove
</Button>
</div>
</td>
</tr>
))}
问题内容: 我正在考虑将Django用于我要开始的项目(fyi,一个基于浏览器的游戏),而我最喜欢的功能之一就是根据我定义的Django模型自动创建数据库表(我似乎在其他任何框架中都找不到的功能)。当我在文档中看到此内容时,我已经认为这太好了,无法实现: Syncdb不会更改现有表 syncdb将仅为尚未安装的模型创建表。安装后,它将永远不会发出ALTER TABLE语句来匹配对模型类所做的更改。
问题内容: 我有一个这样的状态,我正在设置和标记如下: 我有一个列表,其中包含状态为类的项目: 在这里,如何更改特定div的类名? 问题答案: 以下是我相信您正在尝试做的一个功能齐全的示例(带有功能性摘录)。 根据您的问题,您似乎正在为所有元素修改1属性。这就是为什么当您单击一个时,它们全部都被更改了。 尤其要注意,状态跟踪 哪个 元素处于活动状态的索引。当被点击时,它告诉它的索引,更新,随后相应
我决定在 Postgresql 的 Java 项目中使用 liquibase,所以我使用 maven goal 创建了初始变更集。现在它正在毫无问题地工作。 我正在寻找的是,在我对数据库进行了更改(比如从RDBMS客户端)之后,是否有任何命令可以分析更改日志和数据库状态,以根据我的更改生成更改集并将其附加到更改集xml文件中?
本文向大家介绍在SAP HANA中更改数据库视图,包括了在SAP HANA中更改数据库视图的使用技巧和注意事项,需要的朋友参考一下 您可以更改视图,然后我们可以使用“更改视图”命令来更改视图。 示例 我们已应用ALTER命令来更新名称为View_EmpInfo的现有视图,该视图正在对ID列的两个表应用内部联接以创建数据库视图。
问题内容: 保持不变,尽管我在函数中调度了一个动作: 输出为NO_AUTH(的初始值) 减速器: 知道为什么吗? 问题答案: 您当前正在直接在未映射到的componentDidMount内部调度: 这应该做的工作: 现在,这将获得authState:
问题内容: 当用鼠标单击时,如何检测JRadioButton从“未选中”更改为“选中”?我曾尝试在按钮上使用ActionListener,但是每次单击单选按钮时都会触发该事件,而不仅仅是在将状态更改为“选定”时触发。 我曾想过要维护一个记住按钮状态的布尔变量,并在ActionListener中对其进行测试以查看是否更改其状态,但是我想知道是否有更好或更干净的解决方案。 问题答案: 看一下JRadi