React Select 全部用于多个复选框
React Select All for multiple checkboxes
import React, { useState, useEffect } from "react";
import "./styles.css";
export default function App() {
const [checkedAll, setCheckedAll] = useState(false);
const [checked, setChecked] = useState({
nr1: false,
nr2: false
});
/* ################################################ */
/* #### TOGGLES checK STATE BASED ON inputName #### */
/* ################################################ */
const toggleCheck = (inputName) => {
setChecked((prevState) => {
const newState = { ...prevState };
newState[inputName] = !prevState[inputName];
return newState;
});
};
/* ###################################################### */
/* #### CHECKS OR UNCHECKS ALL FROM SELECT ALL CLICK #### */
/* ###################################################### */
const selectAll = (value) => {
setCheckedAll(value);
setChecked((prevState) => {
const newState = { ...prevState };
for (const inputName in newState) {
newState[inputName] = value;
}
return newState;
});
};
/* ############################################# */
/* #### EFFECT TO CONTROL CHECKED_ALL STATE #### */
/* ############################################# */
// IF YOU CHECK BOTH INDIVIDUALLY. IT WILL ACTIVATE THE checkedAll STATE
// IF YOU UNCHECK ANY INDIVIDUALLY. IT WILL DE-ACTIVATE THE checkAll STATE
useEffect(() => {
let allChecked = true;
for (const inputName in checked) {
if (checked[inputName] === false) {
allChecked = false;
}
}
if (allChecked) {
setCheckedAll(true);
} else {
setCheckedAll(false);
}
}, [checked]);
/* ########################## */
/* #### RETURN STATEMENT #### */
/* ########################## */
return (
<div className="App">
<div>
<label>All</label>
<input
type="checkbox"
onChange={(event) => selectAll(event.target.checked)}
checked={checkedAll}
/>
</div>
<div>
<label>1</label>
<input
type="checkbox"
name="nr1"
onChange={() => toggleCheck("nr1")}
checked={checked["nr1"]}
/>
</div>
<div>
<label>2</label>
<input
type="checkbox"
name="nr2"
onChange={() => toggleCheck("nr2")}
checked={checked["nr2"]}
/>
</div>
</div>
);
}
我想创建一个 Select All Checkbox 功能,如以下代码所示:
https://codesandbox.io/s/festive-framework-8l2ez?file=/src/App.js
如何将上述代码用于复选框数组?我相信可以使用 map 来解决它,但我无法实现它。
在上面的代码中,分别为 nr1 和 nr2 设置了值。
您可以只在顶部有一个数组来定义复选框和创建初始状态。然后循环进入数组以显示复选框。试试下面的代码
const dataArray = ['nr1', 'nr2'];
const initialState = dataArray.reduce((o, key) => ({ ...o, [key]: false}), {})
export default function App() {
const [checkedAll, setCheckedAll] = useState(false);
const [checked, setChecked] = useState(initialState);
...
...
return (
<div className="App">
<div>
<label>All</label>
<input
type="checkbox"
onChange={(event) => selectAll(event.target.checked)}
checked={checkedAll}
/>
</div>
{dataArray.map(data => (
<div>
<label>{data}</label>
<input
type="checkbox"
name={data}
onChange={() => toggleCheck(data)}
checked={checked[data]}
/>
</div>
))}
</div>
);
import React, { useState, useEffect } from "react";
import "./styles.css";
export default function App() {
const [checkedAll, setCheckedAll] = useState(false);
const [checked, setChecked] = useState({
nr1: false,
nr2: false
});
/* ################################################ */
/* #### TOGGLES checK STATE BASED ON inputName #### */
/* ################################################ */
const toggleCheck = (inputName) => {
setChecked((prevState) => {
const newState = { ...prevState };
newState[inputName] = !prevState[inputName];
return newState;
});
};
/* ###################################################### */
/* #### CHECKS OR UNCHECKS ALL FROM SELECT ALL CLICK #### */
/* ###################################################### */
const selectAll = (value) => {
setCheckedAll(value);
setChecked((prevState) => {
const newState = { ...prevState };
for (const inputName in newState) {
newState[inputName] = value;
}
return newState;
});
};
/* ############################################# */
/* #### EFFECT TO CONTROL CHECKED_ALL STATE #### */
/* ############################################# */
// IF YOU CHECK BOTH INDIVIDUALLY. IT WILL ACTIVATE THE checkedAll STATE
// IF YOU UNCHECK ANY INDIVIDUALLY. IT WILL DE-ACTIVATE THE checkAll STATE
useEffect(() => {
let allChecked = true;
for (const inputName in checked) {
if (checked[inputName] === false) {
allChecked = false;
}
}
if (allChecked) {
setCheckedAll(true);
} else {
setCheckedAll(false);
}
}, [checked]);
/* ########################## */
/* #### RETURN STATEMENT #### */
/* ########################## */
return (
<div className="App">
<div>
<label>All</label>
<input
type="checkbox"
onChange={(event) => selectAll(event.target.checked)}
checked={checkedAll}
/>
</div>
<div>
<label>1</label>
<input
type="checkbox"
name="nr1"
onChange={() => toggleCheck("nr1")}
checked={checked["nr1"]}
/>
</div>
<div>
<label>2</label>
<input
type="checkbox"
name="nr2"
onChange={() => toggleCheck("nr2")}
checked={checked["nr2"]}
/>
</div>
</div>
);
}
我想创建一个 Select All Checkbox 功能,如以下代码所示: https://codesandbox.io/s/festive-framework-8l2ez?file=/src/App.js
如何将上述代码用于复选框数组?我相信可以使用 map 来解决它,但我无法实现它。 在上面的代码中,分别为 nr1 和 nr2 设置了值。
您可以只在顶部有一个数组来定义复选框和创建初始状态。然后循环进入数组以显示复选框。试试下面的代码
const dataArray = ['nr1', 'nr2'];
const initialState = dataArray.reduce((o, key) => ({ ...o, [key]: false}), {})
export default function App() {
const [checkedAll, setCheckedAll] = useState(false);
const [checked, setChecked] = useState(initialState);
...
...
return (
<div className="App">
<div>
<label>All</label>
<input
type="checkbox"
onChange={(event) => selectAll(event.target.checked)}
checked={checkedAll}
/>
</div>
{dataArray.map(data => (
<div>
<label>{data}</label>
<input
type="checkbox"
name={data}
onChange={() => toggleCheck(data)}
checked={checked[data]}
/>
</div>
))}
</div>
);