- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
仅在单击提交按钮时将数据从多个复选框传递到 api
当我单击复选框时,我的网站上有这个 Accordion ,所有复选框值都存储在状态中,最后当我单击提交时,只有数据被传递给 api,存储的数据如下所示
const getAccordionItem = ({ key, label }) => {
const source = key === "Custom" ? "custom" : "items";
return (
<div className="accordion-item" key={key}>
<div
className="accordion-title gradiantblur"
onClick={() => navClose(key)}
>
{/* // onClick={setActiveCurrentIndex(item[0].date)}> */}
<div>{label}</div>
<i className="fa fa-plus" aria-hidden="true"></i>
</div>
{state[key] ? (
<div className="accordion-content tableforsymtm">
{(source !== "custom"
? state[source].filter(
(item) => item.category === label || item.category === key
)
: state[source]
).map((item, index) => {
return (
<span
key={`${key}__${item.id}__${index}`}
className="trforsymtm"
>
<td>
<input
// className="invinsiveinput"
data-id={item.id}
type="checkbox"
id={item.id}
checked={item && item.positive}
onChange={(e) => handleCheckboxChange(e, source, item.id)}
/>
</td>
<td className="tdoneline">
<label htmlFor={item.id}>{item.name}</label>
</td>
</span>
);
})}
</div>
) : null}
</div>
);
};
const handleCheckboxChange = (e, stateKey, itemId) => {
const stateItems = state[stateKey];
const index = stateItems.findIndex((item) => item.id === itemId);
setState((prevState) => ({
...prevState,
[stateKey]: [
...stateItems.slice(0, index),
{
...stateItems[index],
positive: e.target.checked,
},
...stateItems.slice(index + 1),
],
}));
};
提交按钮点击
const chekbox = (e) => {
e.preventDefault();
const headers = {
};
const data = {
items: [...state.items]
.filter((item) => item.positive)
.map((item) => ({
date: state.today,
symptom: item.id,
positive: item.positive,
})),
};
const custum = {
items: [...state.custom]
.filter((item) => item.positive)
.map((item) => ({
date: state.today,
symptom: item.id,
positive: item.positive,
})),
};
console.log(custum);
axios.post("/customer/submit-multiple/", data, {
headers: headers,
});
axios
.post("/customer/submit-custom-multiple/", custum, {
headers: headers,
})
.then(() => {
alert("was submitted");
window.location.reload();
})
.catch((error) => {
alert("Cannot add submittedagain");
});
};
我在代码沙箱中添加的完整代码
[
{
"date" : "2022-02-15",
"id" : 6,
"positive" : true
},
{
"date" : "2022-02-15",
"id" : 5,
"positive" : true
},
{
"date" : "2022-02-15",
"id" :7,
"positive" : true
},
{
"date" : "2022-02-15",
"id" : 11,
"positive" : true
},
{
"date" : "2022-02-15",
"id" : 4,
"positive" : true
}
]
最佳答案
我不确定我是否正确理解了您的问题。但我试图让它只在提交按钮点击时提交值。另外,我尝试使用功能组件并修改了您的代码以使其更简单(如果没有,我希望您了解新的功能组件方式,这是编写 React 组件的新方式)。
您可以在此处查看完整版本:https://codesandbox.io/s/relaxed-tesla-qwmh7v?file=/src/App.js .
由于某种原因,API 仍然失败,但不知道为什么,但有效负载是你想要的。并且,添加了一些评论来帮助你。让我知道事情的后续!祝你好运! 👍
import React from "react";
import axios from "axios";
import moment from "moment";
import "./styles.css";
// function to get data from API, taken it out since it
// does not depend on state as such, we can pass date a param
const getData = (date) => {
const config = {
headers: {
// can be taken from localStorage
Authorization: `token 67f023b5e798b8e7217bffc4b74a23b40666c589`
}
};
return axios
.get(
`https://shebirth.herokuapp.com/customer/Symptoms-GET/?date=${date}`,
config
)
.then((res) => res.data)
.catch((err) => {
console.error("error ocurred while fetching data", err);
return null;
});
};
const SYMPTOMS_CATEGORIES = [
{ key: "Head", label: "Head" },
{ key: "Pelvis", label: "Pelvis" },
{ key: "Legs", label: "Legs" },
{ key: "Other", label: "Other" },
{ key: "Abdomen", label: "Abdomen" },
{ key: "Mental", label: "Mental Health" },
{ key: "Custom", label: "User Defined" }
];
const styles = {
trgrid: {
display: "grid",
gridTemplateColumns: "1fr 1fr 1fr 1fr"
},
module: {
position: "relative",
// background: "rgb(76, 0, 61) none repeat scroll 0% 0%",
background: "#ffffff1c 0% 0% no-repeat padding-box",
margin: "0px 30px",
borderRadius: "10px",
padding: "0px 0px 20px 0px",
height: "40rem",
overflowY: "scroll",
scrollbarWidth: "thin",
marginbottom: "10px"
},
txt: {
textAlign: "left"
},
btn: {
border: "1px solid #974cae",
padding: "5px 30px",
background: "#974cae",
fontSize: "12px"
},
left: {
textAlign: "left"
},
boxstyle: {
background: "#ffffff1c 0% 0% no-repeat padding-box",
marginTop: "10px"
},
flex: {
background: "#ffffff1c 0% 0% no-repeat padding-box",
marginTop: "10px",
display: "flex"
// justifyContent: "space-evenly",
//background: "#971cae",
},
subbtn: {
background: "linear-gradient(90deg, #3a51a7 30%, #b53899)",
padding: "10px 30px",
border: "none",
borderRadius: "10px",
color: "#fff",
cursor: "pointer",
margin: "10px"
},
// NOTE: just for demo styling purpose for separate headings a bit!!
// use your own styles!!!
accordionItem: {
marginTop: "10px",
marginBottom: "10px"
},
accordionHeader: {
fontWeight: "bold",
cursor: "pointer",
backgroundColor: "#7986cb",
color: "#000",
padding: "2px 4px"
}
// demo styles ends
};
const SymptomTracker = () => {
const [state, setState] = React.useState({
medicineOpen: true,
medicineReady: true,
symptomReady: false,
items: [],
dateState: [],
custom: [],
Head: false,
Pelvis: false,
Legs: false,
Mental: false,
Other: false,
Custom: false,
today: moment().format("YYYY-MM-DD"),
report: [],
allValues: {
others: "",
bloodSugar: "",
bloodPressure: ""
}
});
// const closeMedicine = () => {
// setState((prevState) => ({
// ...prevState,
// medicineOpen: !state.medicineOpen
// }));
// };
// const addMedicine = () => {
// setState((prevState) => ({
// ...prevState,
// medicineReady: !state.medicineReady
// }));
// };
const addSymptom = () => {
setState((prevState) => ({
...prevState,
symptomReady: !state.symptomReady
}));
};
const navClose = (e) => {
setState((prevState) => ({
...prevState,
[e]: !prevState[e]
}));
};
const onDateChange = (e) => {
var dateSelected = e.target.value;
var date = moment(dateSelected).format("YYYY-MM-DD");
console.log({ date });
setState((prevState) => ({ ...prevState, today: date }));
};
const handleCheckboxChange = (e, stateKey, itemId) => {
const stateItems = state[stateKey];
console.table(stateItems);
console.log({ stateKey });
const index = stateItems.findIndex((item) => item.id === itemId);
console.log({ item: stateItems[index] });
setState((prevState) => ({
...prevState,
[stateKey]: [
...stateItems.slice(0, index),
{
...stateItems[index],
positive: e.target.checked
},
...stateItems.slice(index + 1)
]
}));
};
const changeHandler = (e) => {
setState((prevState) => ({
...prevState,
allValues: {
...prevState.allValues,
[e.target.name]: e.target.value
}
}));
};
const getAccordionItem = ({ key, label }) => {
const source = key === "Custom" ? "custom" : "items";
return (
<div className="accordion-item" style={styles.accordionItem} key={key}>
<div
className="accordion-title gradiantblur"
style={styles.accordionHeader}
onClick={() => navClose(key)}
>
{/* // onClick={setActiveCurrentIndex(item[0].date)}> */}
<span>{label}</span>
<i className="fa fa-plus" aria-hidden="true"></i>
</div>
{state[key] ? (
<div className="accordion-content tableforsymtm">
{(source !== "custom"
? state[source].filter(
(item) => item.category === label || item.category === key
)
: state[source]
).map((item, index) => {
const itemId = `${key}__${item.name}__${item.id}__${index}`;
return (
<span key={itemId} className="trforsymtm">
<td>
<input
// className="invinsiveinput"
data-id={item.id}
type="checkbox"
id={itemId}
checked={item && item.positive}
onChange={(e) => handleCheckboxChange(e, source, item.id)}
/>
</td>
<td className="tdoneline">
<label htmlFor={itemId}>{item.name}</label>
</td>
</span>
);
})}
</div>
) : null}
</div>
);
};
// handle checked items submission
const chekbox = (e) => {
e.preventDefault();
const headers = {
// Authorization: `token ` + localStorage.getItem("token")
Authorization: `token 67f023b5e798b8e7217bffc4b74a23b40666c589`
// Authorization: `token 67f023b5e798b8e7217bffc4b74a23b40666c589`,
};
const data = [...state.items]
// keep all items
// .filter((item) => item.positive)
.map((item) => ({
date: state.today,
symptom: item.id,
positive: item.positive
}));
const custom = [...state.custom]
// keep all items
//.filter((item) => item.positive)
.map((item) => ({
date: state.today,
symptom: item.id,
positive: item.positive
}));
console.log(custom);
// submit both requests parallelly and once both gets done
// then only reload the page.
Promise.all([
axios.post(
"https://shebirth.herokuapp.com/customer/symptoms-submit-multiple/",
data,
{
headers: headers
}
),
axios.post(
"https://shebirth.herokuapp.com/customer/submit-custom-symptom-multiple/",
custom,
{
headers: headers
}
)
])
.then(() => {
alert("symptoms are submitted");
window.location.reload();
})
.catch((error) => {
alert("Cannot add symptoms again");
console.error(error);
});
};
const onSubmit = (e) => {
e.preventDefault();
const headers = {
// Authorization: `token ` + localStorage.getItem("token")
Authorization: `token 67f023b5e798b8e7217bffc4b74a23b40666c589`
};
// prepare data object
const data = {
others: state.allValues.others,
bloodSugar: state.allValues.bloodSugar,
bloodPressure: state.allValues.bloodPressure,
date: state.today,
// combining custom and normal items together, can be separated if you want
// in their each keys
items: [...state.items, ...state.custom]
// keep all items
// .filter((item) => item.positive)
.map((item) => ({
date: state.today,
symptom: item.id,
positive: item.positive
}))
};
axios
.patch("customer/submit-symptoms-with-input/", data, {
headers: headers
})
.then(() => {
alert("symptom was submitted");
window.location.reload();
})
.catch((error) => {
alert("Cannot add symptoms again");
});
};
// this effect will fire once the component is mounted, and on `state.date` changes.
React.useEffect(() => {
(async () => {
const data = await getData(state.today);
// console.log({ data });
if (data) {
setState((prevState) => ({
...prevState,
items: data.Symptoms,
custom: data.customSymptom,
allValues: data.symptomsWithIputs,
report: data.last_week_symptom_report
}));
}
})();
}, [state.today]);
return state.medicineOpen ? (
<div className="symptom-container" style={styles.module}>
<h2
className="lightgradient"
style={{
borderBottom: "1px solid #fff",
padding: "10px",
margin: "0px",
fontSize: "24px",
// background: "#6f1f6d",
borderTopLeftRadius: "10px",
borderTopRightRadius: "10px"
}}
>
Symptom Tracker
</h2>
<div style={styles.boxstyle}>
<span style={{ fontSize: "16px" }}> Enter Date</span>
<input
type="date"
className="calanderbutton"
value={state.today}
onChange={onDateChange}
/>
{/* accordion */}
<div className="accordion">
{SYMPTOMS_CATEGORIES.map(getAccordionItem)}
</div>
<button type="Button" className="pinkbutton" onClick={chekbox}>
submit check boxes
</button>
{/* form */}
<form onSubmit={onSubmit}>
<div style={styles.flex}>
<div
className="marign-5"
style={{
transform: "rotate(90deg)",
fontSize: "4rem",
padding: "15px"
}}
>
{/* <img src={img1} /> */}
{/* <i className="fa fa-pencil"></i> */}
</div>
<div className="marign-5" style={{ padding: "10px" }}>
<strong>Enter your weight</strong>
<br />
<br />
<input
className="inputofsymtum"
style={{ float: "left" }}
name="others"
placeholder="Kg"
onChange={changeHandler}
defaultValue={state.allValues && state.allValues.others}
type="text"
// placeholder="Description"
/>
</div>
</div>
<div style={styles.flex}>
<div
className="marign-5"
style={{ fontSize: "4rem", padding: "15px" }}
>
{/* <img src={img2} /> */}
{/* <i className="fa fa-level-up"></i> */}
</div>
<div className="marign-5" style={{ padding: "10px" }}>
<strong>Enter your blood sugar level</strong>
<br />
<br />
<input
className="inputofsymtum"
style={{ float: "left" }}
type="text"
name="bloodSugar"
placeholder="(mg/dL)"
onChange={changeHandler}
defaultValue={state.allValues && state.allValues.bloodSugar}
/>
</div>
</div>
<div style={styles.flex}>
<div
className="marign-5"
style={{ fontSize: "4rem", padding: "15px" }}
>
{/* <img src={img3} /> */}
{/* <i className="fa fa-area-chart"></i> */}
</div>
<div className="marign-5" style={{ padding: "10px" }}>
<strong>Enter your blood pressure level</strong>
<br />
<br />
<input
className="inputofsymtum"
style={{ float: "left" }}
type="text"
placeholder="(mmHg)"
name="bloodPressure"
onChange={changeHandler}
defaultValue={state.allValues && state.allValues.bloodPressure}
// onChange={changeHandler}
// value={state.allValues.bloodPressure}
/>
</div>
</div>
<div style={styles.flex}>
<div
className="marign-5"
style={{
transform: "rotate(90deg)",
fontSize: "4rem",
padding: "15px"
}}
>
{/* <img src={img4} /> */}
{/* <i className="fa fa-pie-chart"></i> */}
</div>
<div className="marign-5" style={{ padding: "10px" }}>
<strong>Last week report</strong>
<br />
<br />
<p className="fontin12">
Last week you have experienced
{state.report.map((personData, key) => {
return (
<span key={key}>
{personData.count} times
{personData.symptom} ,
</span>
);
})}
</p>
</div>
</div>
<div>
<button type="submit" className="pinkbutton">
Submit
</button>
</div>
<br />
{/* {state.symptomReady ? <AddSymptom /> : null} */}
<span
onClick={addSymptom}
// style={styles.subbtn}
className="pinkbutton"
style={{ cursor: "pointer", fontSize: "16px" }}
>
Add User Defined Symptom
</span>
<hr />
</form>
</div>
</div>
) : null;
};
export default SymptomTracker;
关于javascript - 仅在单击提交按钮时将数据从多个复选框传递到 api :react js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71140935/
所以我有这个 javascript 片段,它有两个按钮可以进入全屏,一个按钮可以退出全屏。我想做到这一点,如果我不在全屏模式下,按钮会显示转到全屏模式,而当我处于全屏模式时,按钮会显示退出全屏模式..
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我在自定义控件中添加了一个新属性作为可扩展属性,例如属性网格中的字体属性。在 Windows 窗体应用程序项目中使用我的自定义控件后,我在属性网格中看到一个省略号 (…) 按钮,如字体属性的“…”按钮
我尝试将 Twitter 上的“Tweet Me”按钮 ( http://twitter.com/goodies/tweetbutton ) 添加到我的网站。然而,每当按下按钮时,我都会收到此 Jav
我试图在我的文本区域中获取一个按钮值,如果我使用 则工作正常但如果我使用那么它就不起作用了。你能找出问题所在吗? HTML 1 2 3 4 JavaScript $(document).read
我的 C# Winform 面板中有一堆文本框。每行文本框的命名如下: tb1 tbNickName1 comboBox1 tb2 tbNickName2 comboBox2 tb3 tbNickNa
我有一个表单,其中过滤器下方有按钮(应用过滤器和清除过滤器),我试图在单击“应用”按钮时显示“清除”,并在单击“清除”按钮时隐藏“清除”按钮。 下面的代码(如果我的表有的话):
excel 按钮正在工作,但是当我添加 pdf 按钮时,它添加仅显示 pdf 按钮 excel 按钮在 pdf 按钮添加后隐藏 $(document).ready(function() { $
我想创建一个 div 作为标题并分成 3 列,并按以下顺序在其中放置 2 个按钮和一个标题:Button1(左位) Title(居中) Button2(右位) 这是我为这个 div 编写的代码:
仅当选中所有框时才应禁用“允许”按钮。我该怎么做?我已经完成了 HTML 部分,如下所示。如何执行其中的逻辑部分?即使未选中一个复选框,也应禁用“允许”按钮
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
如您所知,您可以使用 2 种方法在 HTML5 中呈现按钮: 使用 void 元素 或 如果您需要内容,请使用 元素(不是空元素)。 在JSF2中,有2种方式生成按钮;与UICommand或 UIOu
我尝试根据表单元素的更改禁用/启用保存按钮。但是,当通过弹出按钮选择更改隐藏输入字段值时,保存按钮不受影响。 下面是我的代码。我正在尝试序列化旧的表单值并与更改后的表单值进行比较。但我猜隐藏的字段值无
我有用于在消息(电子邮件、短信)上输入内容的 EditText。我希望在单击 ActionDone 按钮时立即发布消息。我为此使用以下代码: message.setOnEditorActionList
我的 Android 应用程序中有一堆 EditText,每个都将 InputMethod 设置为 numberSigned。我的目标设备没有硬件键盘,而是使用软件键盘输入数字。 Android 将输
我无法以编程方式隐藏弧形菜单中的 fab 按钮。我正在使用https://github.com/saurabharora90/MaterialArcMenu在我的代码中。如何在Java中以编程方式隐藏
我已经看到这在其他类型的对话框窗口中是可能的,例如“showConfirmDialog”,其中可以指定按钮的数量及其名称;但是使用“showInputDialog”时是否可以实现相同的功能?我似乎无法
相同的按钮用于激活和停用。第一次,当代码运行按钮单击并成功“停用”时。但第二次,代码无法找到该元素。第一个案例按钮位于第二个“a”标签中,然后停用第一个“a”标签中的按钮。 案例1: Edit
是否可以将按钮的 onclick 操作设置为 JavaScript 变量?这个想法是我们用 JavaScript 控制一个表。每当点击该表的一行时,我们就会更新一个 JavaScript 变量。该 v
我想创建一个按钮,它包含左侧的文本和右侧的复选框(或任何其他组件)。我怎样才能做到这一点? 我发现我可以制作自己的 View extends Button,但是如果可以的话我应该如何实现 onDraw
我是一名优秀的程序员,十分优秀!