React 로 완전한 TodoList 의 예제 코드 를 실현 합 니 다.
1.우선 효과 도 에 따라 실현 할 기능 에 대해 이야기 해 주세요.
todoList 최종 효과 도
(1)퀘 스 트 를 추가 할 수 있 습 니 다.
(2)이미 완성 한 퀘 스 트 와 미 완성 퀘 스 트 의 색상 구분;
(3)퀘 스 트 추가,퀘 스 트 상태 수정,퀘 스 트 삭제 시 아래 퀘 스 트 완성 수량 과 퀘 스 트 총 수 를 변경 합 니 다.
이상 은 실현 해 야 할 기능 이다.
2.이제 어떻게 디자인 해 야 하나 요?
(1)작업 에 저 장 된 데이터 구조:
list: [{
id: 0,
name: ' ',
status: 0
}, {
id: 1,
name: ' ',
status: 0
}, {
id: 2,
name: ' ',
status : 0
}]
모든 작업 은 자신의 id,작업 이름,작업 상태 가 있 습 니 다.작업 의 id 는 표지 작업 의 유일 성 을 제외 하고 목록 항목 의 key 값 으로 도 사용 할 수 있 습 니 다.우 리 는 react 에서 목록 을 사용 하 는 것 을 알 고 있 습 니 다.목록 의 모든 항목 에 key 값 이 있어 야 합 니 다.그러면 모든 목록 항목 이 빠 른 포 지 셔 닝 을 할 수 있 고 Diff 알고리즘 을 실행 할 때 불필요 한 조 회 를 줄 여 성능 향상 에 도움 이 됩 니 다.(2)구성 요소 의 구분
목록 항목 ListItem 의 실현 을 예 로 들 면:
목록 항목 을 하나의 구성 요소 로 나 누 는 것 은 필수 적 입 니 다.이렇게 하면 모든 단독 항목 이 독립 되 고 코드 의 논 리 를 더욱 간단 하 게 하 며 코드 의 재 활용 성 을 강화 하고 유지 도 더욱 간단 해 집 니 다.
물론 똑똑 한 당신 은 하나의 문 제 를 생각 할 것 입 니 다.모든 Task 의 상태 가 바 뀌 거나 Task 의 추가 삭제,Task 의 완성 수량 과 전체 항목 이 바 뀌 지만 모든 ListItem 은 서로 독립 되 어 있 습 니 다.어떻게 실현 합 니까?이 때 는 부자 구성 요소 간 의 통신 을 사용 해 야 한다.
만약 당신 도 나 와 같은 React 의 초보 자 라면 바 이 두 는 부자 구성 요소 간 에 어떻게 통신 하 는 지 에 대해 많은 글 이 나 올 것 입 니 다.다음은 제 가 간단 하고 거 친 이 해 를 간단히 말씀 드 리 겠 습 니 다.
부자 구성 요소 에서 state 데 이 터 를 바 꾸 는 방법 을 정의 합 니 다.방법 을 props 형식 으로 하위 구성 요소 에 전달 하고 하위 구성 요소 에서 이벤트 처리 프로그램 을 실행 한 다음 특정한 조건 을 만족 시 키 면 부모 구성 요소 가 보 내 는 함 수 를 실행 합 니 다.
구체 적 인 코드 는 다음 과 같다.
부모 구성 요소 의 코드:
import React, { Component } from 'react';
import ListItem from './listItem';
import Dialog from './dialog';
import './main.css';
class TodoList extends Component {
constructor (props) {
super(props);
//
this.state = {
list: [{
id: 0,
name: ' ',
status: 0
}, {
id: 1,
name: ' ',
status: 0
}, {
id: 2,
name: ' ',
status : 0
}],
finished: 0
};
}
// , props
addTask (newitem) {
var allTask = this.state.list;
allTask.push(newitem);
this.setState({
list: allTask
});
}
// , props
updateFinished (todoItem) {
var sum = 0;
this.state.list.forEach( (item) => {
if (item.id === todoItem.id) {
item.status = todoItem.status;
}
if (item.status === 1) {
sum++;
}
});
this.setState({
finished: sum
});
}
// , props
updateTotal (todoItem) {
var obj = [], sum = 0;
this.state.list.forEach((item) => {
if (item.id !== todoItem.id) {
obj.push(item);
if (item.status === 1 ) {
sum++;
}
}
});
this.setState({
list: obj,
finished: sum
});
}
render () {
return (
<div className="container">
<h1>TodoList</h1>
<ul>
{ this.state.list.map ((item, index) =>
<ListItem
item={item}
finishedChange={this.updateFinished.bind(this)}
totalChange={this.updateTotal.bind(this)}
key={index}
/>
)}
<li>{this.state.finished} / {this.state.list.length} </li>
</ul>
<Dialog addNewTask={this.addTask.bind(this)} nums={this.state.list.length}/>
</div>
);
}
}
export default TodoList;
하위 구성 요소 의 코드:
import React, { Component } from 'react';
class ListItem extends Component {
constructor (props) {
super(props);
this.handleFinished = this.handleFinished.bind(this);
this.handleDelete = this.handleDelete.bind(this);
}
handleFinished () {
var status = this.props.item.status;
status = (status === 0 ? 1 : 0);
var obj = {
id: this.props.item.id,
name: this.props.item.name,
status: status
}
this.props.finishedChange(obj); //
}
handleDelete () {
this.props.totalChange(this.props.item); //
}
render () {
const item = this.props.item;
const unfinish = {
backgroundColor: '#DFFCB5',
color: '#2EB872',
};
const finish = {
backgroundColor: '#FFFA9D',
color: '#FF9A3C',
textDecoration: 'line-through'
}
var itemStyle = item.status === 0 ? unfinish : finish;
return (
<li key={item.id} style={itemStyle}>
<span
onClick={this.handleFinished}
id={item.id}
className="check-btn"
style={{backgroundColor: item.status === 0 ? '#fff' : '#A1EAFB'}}
></span>
<span>{ item.name }</span>
<span onClick={this.handleDelete} className="delete-btn"> </span>
</li>
);
}
}
export default ListItem;
이상 은 이 작은 연습 에 대한 정리 입 니 다.만약 에 당신 도 나 처럼 react 초보 라면 이것 을 쓰 고 React 에 대해 더 가 까 운 이 해 를 가 질 것 이 라 고 믿 습 니 다.작은 연습 이상github에 전달 되 었 으 니 참고 하 실 수 있 습 니 다!여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바삭바삭하고 간단한 결제 페이지 만들기먼저 Next.js에서 프로젝트를 만듭니다. Vercel & Next.js가 매우 편하기 때문에 최근에는이 구성을 사용하고 있습니다. 그런 다음 Tailwind CSS를 넣습니다. Tailwind CSS를 사용하면 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.