如何在没有提交按钮的情况下将 POST 请求从 React 发送到 Flask
How to send POST request from React to Flask without submit button
嘿抱歉,我对 React 和 Javascript 完全陌生,对此我真的很困惑。我正在尝试创建一个部分,其中我将在 React 中有一个下拉列表。我已经从 Flask 中获取了数据,现在当我单击我选择的选项时,我想将 POST 请求发送到 Flask(无需单击任何提交按钮)。
我阅读了不同的答案并试图找出答案,所以我在获取数据时使用了“fetch”,在尝试发送请求时使用了“axios”。
App.js
import React, { useEffect, useState } from "react"
import { DropdownItem } from "../Components/DropdownItem"
import Select from "react-select"
import axios from "axios"
export const DropdownPage = () => {
const [years, setYears] = useState([])
const [selectedYear, setSelectedYear] = useState("")
useEffect(() => {
fetch("http://127.0.0.1:5000/api", {
method: "GET",
headers: {
"Content-type": "application/json",
},
})
.then((res) => res.json())
.then((data) => {
setYears(data)
})
}, [])
const handleDropdownSelectYear = (e) => {
setSelectedYear(e.target.value)
}
const handleDropdownSubmitYear = (e) => {
e.preventDefault()
console.log(e)
axios
.post("http://127.0.0.1:5000/api/yearselect", selectedYear)
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
}
return (
<div>
<form method="post" onSubmit={handleDropdownSubmitYear}>
<select onChange={handleDropdownSelectYear}>
<option value="">Select Year</option>
{years.map((year) => (
<DropdownItem key={year.id} year={year}></DropdownItem>
))}
</select>
</form>
</div>
)
}
api.py
class Year(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.Text, nullable=False)
def __str__(self):
return f'{self.id} {self.content}'
def year_serializer(year):
return {'id': year.id,
'content': year.content}
@app.route('/api', methods=['GET'])
def index():
return jsonify([*map(year_serializer, Year.query.all())])
@app.route('/api/yearselect', methods=['POST'])
def yearselect():
if request.method == 'POST':
request_data = request.get_json(force=True)
year = Year(content=request_data['content'])
db.session.add(year)
db.session.commit()
return {"201": request_data['content']}
如果您还需要 information/code,请告诉我。另外,我打算在下面重新创建这张图片。因此,当我在第一个下拉菜单中做出选择时,它应该向 flask 发送请求并缩小下一个下拉菜单的选项范围,依此类推。如果您需要任何说明,请告诉我。谢谢!!
如果您想在做出选择时发送 POST 请求,则不需要 <form>
或提交处理程序。
相反,添加一个效果挂钩来监听 selectedYear
的变化
// if selectedYear is going to be an object, don't initialise it as a string
const [selectedYear, setSelectedYear] = useState();
useEffect(() => {
if (selectedYear) {
fetch("http://127.0.0.1:5000/api/yearselect", {
method: "POST",
body: JSON.stringify(selectedYear),
headers: { "content-type": "application/json" },
})
.then((res) => {
if (!res.ok) return Promise.reject(res);
return res.json();
})
.then((data) => {
// do something with data ¯\_(ツ)_/¯
})
.catch(console.error);
}
}, [selectedYear]); // effect hook dependencies
Effect hooks 也 运行 当初始化值时,建议在发出请求之前检查 selectedYear
的值。
Axios 等价物是
axios.post("http://127.0.0.1:5000/api/yearselect", selectedYear)
.then(({ data }) => {
// do something with data
})
.catch(err => {
console.error(err.toJSON());
});
请尝试一下.. 您可以将数据发送到后端 onchange 函数直接调用 handleDropdownSelectYear
函数
const handleDropdownSelectYear = (e) => {
setSelectedYear(e.target.value)
console.log(e)
axios
.post("http://127.0.0.1:5000/api/yearselect", e.target.value)
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
}
或者你可以使用 useeffect 。
const handleDropdownSelectYear = (e) => {
setSelectedYear(e.target.value)
}
useEffect(() => {
if (selectedYear) {
axios
.post("http://127.0.0.1:5000/api/yearselect", selectedYear)
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
}
}, [selectedYear]);
嘿抱歉,我对 React 和 Javascript 完全陌生,对此我真的很困惑。我正在尝试创建一个部分,其中我将在 React 中有一个下拉列表。我已经从 Flask 中获取了数据,现在当我单击我选择的选项时,我想将 POST 请求发送到 Flask(无需单击任何提交按钮)。
我阅读了不同的答案并试图找出答案,所以我在获取数据时使用了“fetch”,在尝试发送请求时使用了“axios”。
App.js
import React, { useEffect, useState } from "react"
import { DropdownItem } from "../Components/DropdownItem"
import Select from "react-select"
import axios from "axios"
export const DropdownPage = () => {
const [years, setYears] = useState([])
const [selectedYear, setSelectedYear] = useState("")
useEffect(() => {
fetch("http://127.0.0.1:5000/api", {
method: "GET",
headers: {
"Content-type": "application/json",
},
})
.then((res) => res.json())
.then((data) => {
setYears(data)
})
}, [])
const handleDropdownSelectYear = (e) => {
setSelectedYear(e.target.value)
}
const handleDropdownSubmitYear = (e) => {
e.preventDefault()
console.log(e)
axios
.post("http://127.0.0.1:5000/api/yearselect", selectedYear)
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
}
return (
<div>
<form method="post" onSubmit={handleDropdownSubmitYear}>
<select onChange={handleDropdownSelectYear}>
<option value="">Select Year</option>
{years.map((year) => (
<DropdownItem key={year.id} year={year}></DropdownItem>
))}
</select>
</form>
</div>
)
}
api.py
class Year(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.Text, nullable=False)
def __str__(self):
return f'{self.id} {self.content}'
def year_serializer(year):
return {'id': year.id,
'content': year.content}
@app.route('/api', methods=['GET'])
def index():
return jsonify([*map(year_serializer, Year.query.all())])
@app.route('/api/yearselect', methods=['POST'])
def yearselect():
if request.method == 'POST':
request_data = request.get_json(force=True)
year = Year(content=request_data['content'])
db.session.add(year)
db.session.commit()
return {"201": request_data['content']}
如果您还需要 information/code,请告诉我。另外,我打算在下面重新创建这张图片。因此,当我在第一个下拉菜单中做出选择时,它应该向 flask 发送请求并缩小下一个下拉菜单的选项范围,依此类推。如果您需要任何说明,请告诉我。谢谢!!
如果您想在做出选择时发送 POST 请求,则不需要 <form>
或提交处理程序。
相反,添加一个效果挂钩来监听 selectedYear
// if selectedYear is going to be an object, don't initialise it as a string
const [selectedYear, setSelectedYear] = useState();
useEffect(() => {
if (selectedYear) {
fetch("http://127.0.0.1:5000/api/yearselect", {
method: "POST",
body: JSON.stringify(selectedYear),
headers: { "content-type": "application/json" },
})
.then((res) => {
if (!res.ok) return Promise.reject(res);
return res.json();
})
.then((data) => {
// do something with data ¯\_(ツ)_/¯
})
.catch(console.error);
}
}, [selectedYear]); // effect hook dependencies
Effect hooks 也 运行 当初始化值时,建议在发出请求之前检查 selectedYear
的值。
Axios 等价物是
axios.post("http://127.0.0.1:5000/api/yearselect", selectedYear)
.then(({ data }) => {
// do something with data
})
.catch(err => {
console.error(err.toJSON());
});
请尝试一下.. 您可以将数据发送到后端 onchange 函数直接调用 handleDropdownSelectYear
函数
const handleDropdownSelectYear = (e) => {
setSelectedYear(e.target.value)
console.log(e)
axios
.post("http://127.0.0.1:5000/api/yearselect", e.target.value)
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
}
或者你可以使用 useeffect 。
const handleDropdownSelectYear = (e) => {
setSelectedYear(e.target.value)
}
useEffect(() => {
if (selectedYear) {
axios
.post("http://127.0.0.1:5000/api/yearselect", selectedYear)
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
}
}, [selectedYear]);