아마 당신의 상태를 체크 박스를 나타내는 객체들의 배열과 당신의 필터를 나타내는 문자열을 포함하도록 설정할 수 있습니다. 각 체크 박스 객체는 두 개의 속성, 레이블 텍스트 및 체크 상자 값을 포함합니다.
초기 상태에서는이 배열을 비워 두는 것이 좋습니다. componentDidMount
주기 동안 API 호출을 수행하고받은 정보를 포함하도록 상태를 설정합니다.
constructor(props) {
super(props);
this.state = {
checkboxes: [],
filter: 'ALL'
};
//each checkbox would take the form of {label: 'some label', checked: true}
}
componentDidMount() {
getData(response => { //some API call
this.setState({
checkboxes: response.body
});
});
}
구성 요소가 이러한 체크 박스를 렌더링하려면 사용자 상태의 체크 박스 객체가 실제 DOM 요소와 관련되는 방식을 이해해야합니다. 이를 수행하기 위해 .map
을 활용하는 도우미 함수를 생성 할 수 있습니다. .filter
을 사용하여 주 내 각 개체에 필터를 적용하고 필터와 일치하지 않는 개체를 제거 할 수도 있습니다.
function renderCheckboxes() {
const {checkboxes, filter} = this.state;
return checkboxes
.filter(checkbox =>
filter === 'ALL' ||
filter === 'CHECKED' && checkbox.checked ||
filter === 'UNCHECKED' && !checkbox.checked
)
.map((checkbox, index) =>
<div>
<label>
<input
type="checkbox"
checked={checkbox.checked}
onChange={toggleCheckbox.bind(this, index)}
/>
{checkbox.label}
</label>
</div>
);
}
각 체크 박스에는 onChange 속성이 일부 기능에 매핑되어 있습니다. Controlled Component을 만들므로 checked
속성을 사용하여 렌더링하는 모든 체크 박스에이 값을 제공해야하며 각 구성 요소가 검사되는지 여부를 상태가 제어합니다.귀하의 toggleCheckbox
기능은 다음과 같이 보일 수 있습니다 :
function toggleCheckbox(index) {
const {checkboxes} = this.state;
checkboxes[index].checked = !checkboxes[index].checked;
this.setState({
checkboxes
});
}
또한 다른 문자열로 필터를 설정하는 기능을 만드는 데 유용 할 수 있습니다 : 마지막으로
function updateFilter(filter) {
this.setState({
filter
});
}
, 당신은 이러한 기능을 사용할 수 있습니다 당신의 render
은 확인란을 표시하고 필터 상태를 업데이트하는 링크를 표시합니다 (각 필터 링크를 구분하기 위해 몇 가지 공백을 추가했습니다).
render() {
return (
<div>
{renderCheckboxes.call(this)}
<div>
<h4>Filters ({this.state.filter})</h4>
<a href="#" onClick={updateFilter.bind(this, 'ALL')}>ALL</a>
|
<a href="#" onClick={updateFilter.bind(this, 'CHECKED')}>CHECKED</a>
|
<a href="#" onClick={updateFilter.bind(this, 'UNCHECKED')}>UNCHECKED</a>
</div>
</div>
);
}
다음은이 작업의 예 - 마이너스 API 호출 :
https://jsbin.com/bageyudaqe/edit?js,output
희망이 도움이!
와우! 이것은 정말 놀라운 답변입니다, 많은 감사합니다. – user3611459
도와 드리겠습니다! 이 문제가 해결되면이 대답을 받아 들여야합니다. –
예, 제가 가지고 있으며, 아래의 내 질문을 살펴 보려고하십니까? ;-) – user3611459