"반응 중 사고"에 따라 응용 프로그램 구축
61276 단어 reactfrontendbeginnersjavascript
(이 응용 프로그램의 코드는 github
우선: 우리는 종이 위에 있거나 소프트웨어를 사용하여 모형을 하나 그린다. 아주 많다.
1단계: UI를 어셈블리 계층으로 분해
우리의 응용 프로그램에는 다섯 개의 구성 요소가 있다.
응용 프로그램(녹색): 최상위 구성 요소로 응용 프로그램의 모든 내용을 포함합니다
AddDate(빨간색): 사용자가 입력한 날짜
날짜 목록(갈색): 사용자가 입력한 날짜에 따라 카드 목록 보이기
날짜(파란색): 날짜별 카드를 표시하고 사용자가 입력한 작업을 수신합니다
작업(주황색): 작업 단락 보이기
우리의 구성 요소 차원 구조는 다음과 같다.
2단계: React에서 정적 버전 구축
( git branch for this step )
이제 구성 요소를 추가할 때가 되었다. 이렇게 하면 우리는 응용 프로그램의 정적 레이아웃을 얻을 수 있다.이 단계에서는 상호작용과 관련이 없다.문서에서 언급한 바와 같이, 간단한 응용 프로그램에서 위에서 아래로 구성 요소를 구축하는 것은 통상적으로 더욱 쉽다. (우리의 예시에서 응용 프로그램 구성 요소부터)
응용 프로그램
import React, { Component } from 'react';
import './App.css';
import AddDate from './AddDate';
import DateList from './DateList';
class App extends Component {
render() {
const dates = ['2018-04-23', '2019-06-13', '2014-09-29'];
return (
<div className="App">
<header className="App-header">
<h1>Time Machine</h1>
</header>
<AddDate dates={dates} />
<DateList dates={dates} />
</div>
);
}
}
export default App;
날짜 추가
import React, { Component } from 'react';
class AddDate extends Component {
render() {
return (
<div className="App__form">
<form className="App__form--date">
<div className="App__form--body">
<label>Choose Your Past:</label>
<input type="date" max={new Date().toISOString().split('T')[0]} />
</div>
<div className="App__form--btn">
<button type="submit">Add Date</button>
</div>
</form>
</div>
);
}
}
export default AddDate;
날짜 목록
import React, { Component } from 'react';
import Date from './Date';
class DateList extends Component {
render() {
const { dates } = this.props;
return (
<div className="App__list">
<h2 className="App__list--title">Missions</h2>
<ul className="App__list--items">
{dates.map((date) => (
<Date date={date} key={date} />
))}
</ul>
</div>
);
}
}
export default DateList;
날짜
import React, { Component } from 'react';
import Task from './Task';
class Date extends Component {
render() {
const { date } = this.props;
return (
<li>
<div className="App__card--inner">
<h2>{date}</h2>
<form onSubmit={this.handleFormSubmit} className="App__card">
<div className="App__card--form">
<label>Add Your Task</label>
<textarea
rows="3"
cols="30"
placeholder="type here..."
required
></textarea>
</div>
<div className="App__card--btn">
<button type="submit">Add Task</button>
</div>
</form>
<Task />
</div>
</li>
);
}
}
export default Date;
임무
import React from 'react';
const Task = () => {
return (
<div className="App__task">
<h3>Task</h3>
<p>this is the task paragraph</p>
</div>
);
};
export default Task;
3단계: UI 상태의 최소 표현(전체) 확인
응용 프로그램에 상호작용을 추가하기 위해서, 우리는 데이터 모델을 위해 상태를 만들어야 한다.
우리 애플리케이션의 데이터는 다음과 같습니다.
오류 메시지는 시간의 추이에 따라 달라집니다. 렌더링 방법의'날짜'도구와'날짜'상태에서 계산할 수 있습니다.그러나 우리는 오류가 제출할 때만 나타나는 것이지 다시 나타나는 페이지에만 나타나는 것이 아니기를 희망하기 때문에 우리는 그것을 상태의 일부분으로 간주한다.
카드 날짜는 시간에 따라 변하지만 날짜 상태에 따라 계산할 수 있기 때문에 상태가 아니다.
카드 텍스트는 시간의 변화에 따라 다른 상태나 도구에 근거하여 계산할 수 없기 때문에 상태입니다.
카드 작업은 시간에 따라 달라진다."값"상태에서 계산할 수 있지만, 사용자가 제출할 때 단락의 텍스트를 표시하기만 하면 되기 때문에 상태로 간주해야 합니다.
마지막으로 우리의 상태는 다음과 같다.
4단계: 당신이 있는 주가 어디에 사야 하는지 확인하기
애플리케이션의 각 상태에 대해 다음을 수행합니다.
dates
:날짜 목록 구성 요소가 날짜를 표시합니다.AddDate 구성 요소는 사용자가 삽입한 날짜가 이미 포함되어 있는지 여부에 따라 오류 메시지를 표시합니다.두 구성 요소 모두 날짜 상태에 액세스할 수 있도록 날짜 상태를 상위 구성 요소 - 공통 소유자 구성 요소, 즉 응용 프로그램 구성 요소로 이동해야 합니다.
date
:이 상태는 AddDate 구성 요소에 있습니다. 사용자가 날짜를 선택한 구성 요소이기 때문에 입력한 동작을 제어하려고 합니다.
dateExists / dateEmpty
:이 상태는 AddDate 구성 요소에 존재해야 합니다. 이 날짜가 이미 존재하거나 날짜 필드가 비어 있으면 오류 메시지를 표시해야 합니다.
value
: 이 상태는 사용자가 텍스트를 입력하는 구성 요소이기 때문에 날짜 구성 요소에 존재합니다. 입력 동작을 제어하려고 합니다.
task
:이 상태는 날짜 구성 요소에 존재합니다. 이 구성 요소에서 사용자의 텍스트를 가져와 작업 구성 요소에 전달할 수 있기 때문입니다.
( git branch for this step )
응용 프로그램
import React, { Component } from 'react';
import './App.css';
import AddDate from './AddDate';
import DateList from './DateList';
class App extends Component {
state = {
dates: [],
};
render() {
const dates = ['2018-04-23', '2019-06-13', '2014-09-29'];
return (
<div className="App">
<header className="App-header">
<h1>Time Machine</h1>
</header>
<AddDate dates={dates} />
<DateList dates={dates} />
</div>
);
}
}
export default App;
날짜 추가
import React, { Component } from 'react';
class AddDate extends Component {
state = {
date: new Date().toISOString().split('T')[0],
dateExists: false,
dateEmpty: false,
};
render() {
return (
<div className="App__form">
<form onSubmit={this.handleFormSubmit} className="App__form--date">
<div className="App__form--body">
<label>Choose Your Past:</label>
<input type="date" max={new Date().toISOString().split('T')[0]} />
</div>
<div className="App__form--btn">
<button type="submit">Add Date</button>
</div>
</form>
</div>
);
}
}
export default AddDate;
날짜 목록
import React, { Component } from 'react';
import Date from './Date';
class DateList extends Component {
render() {
const { dates } = this.props;
return (
<div className="App__list">
<h2 className="App__list--title">Missions</h2>
<ul className="App__list--items">
{dates.map((date) => (
<Date date={date} key={date} />
))}
</ul>
</div>
);
}
}
export default DateList;
날짜
import React, { Component } from 'react';
import Task from './Task';
class Date extends Component {
state = {
value: '',
task: '',
};
render() {
const { date } = this.props;
return (
<li>
<div className="App__card--inner">
<h2>{date}</h2>
<form onSubmit={this.handleFormSubmit} className="App__card">
<div className="App__card--form">
<label>Add Your Task</label>
<textarea
rows="3"
cols="30"
placeholder="type here..."
required
></textarea>
</div>
<div className="App__card--btn">
<button type="submit">Add Task</button>
</div>
</form>
<Task task={this.state.task} />
</div>
</li>
);
}
}
export default Date;
임무
import React from 'react';
const Task = (props) => {
return (
<div className="App__task">
<h3>Task</h3>
<p>{props.task}</p>
</div>
);
};
export default Task;
단계 5: 역방향 데이터 흐름 추가
이 단계에서, 우리는 다른 방식으로 데이터에 접근하기를 희망합니다: 하위 구성 요소에서 상위 구성 요소로.구성 요소는 자신의 상태만 업데이트해야 하기 때문에 사용자가 AddDate 구성 요소에 새 날짜를 추가할 때 프로그램 구성 요소 내의 날짜 상태에 직접 접근할 수 없습니다.우리가 접근할 수 있는 방법은 앱에서 AddDate로 리셋을 전달하는 것입니다. 이 리셋은 상태가 업데이트될 때 터치됩니다.onAddDate 리셋은 AddDate 구성 요소에 도구로 전달되며, 새 날짜를 추가할 때 리셋이 실행되고 응용 프로그램 구성 요소에 새 날짜를 전달합니다.
( git branch for this step )
응용 프로그램
import React, { Component } from 'react';
import './App.css';
import AddDate from './AddDate';
import DateList from './DateList';
class App extends Component {
state = {
dates: [],
};
addDate = (date) => {
this.setState((currState) => ({
dates: [...currState.dates, date],
}));
};
render() {
return (
<div className="App">
<header className="App-header">
<h1>Time Machine</h1>
</header>
<AddDate dates={this.state.dates} onAddDate={this.addDate} />
<DateList dates={this.state.dates} />
</div>
);
}
}
export default App;
날짜 추가
import React, { Component } from 'react';
class AddDate extends Component {
state = {
date: new Date().toISOString().split('T')[0],
dateExists: false,
dateEmpty: false,
};
sameDateExists = (currDate) => {
const dates = this.props.dates;
for (let date of dates) {
if (date === currDate) {
return true;
}
}
return false;
};
handleFormSubmit = (event) => {
event.preventDefault();
const dateExists = this.sameDateExists(this.state.date);
if (!dateExists && this.state.date) {
this.props.onAddDate(this.state.date);
this.setState({ dateEmpty: false });
}
if (!this.state.date) {
this.setState({ dateEmpty: true });
}
if (dateExists) {
this.setState({ dateEmpty: false });
}
this.setState({ dateExists });
};
handleDateChange = (event) => {
const { value } = event.target;
this.setState((currState) => ({
...currState,
date: value,
}));
};
render() {
return (
<div className="App__form">
<form onSubmit={this.handleFormSubmit} className="App__form--date">
<div className="App__form--body">
<label>Choose Your Past:</label>
<input
type="date"
max={new Date().toISOString().split('T')[0]}
onChange={this.handleDateChange}
/>
</div>
<div className="App__form--btn">
<button type="submit">Add Date</button>
</div>
</form>
{this.state.dateExists ? (
<p className="App__form--error">This date has already been chosen</p>
) : (
''
)}
{this.state.dateEmpty ? (
<p className="App__form--error">Please choose a date</p>
) : (
''
)}
</div>
);
}
}
export default AddDate;
날짜 목록
import React, { Component } from 'react';
import Date from './Date';
class DateList extends Component {
render() {
const { dates } = this.props;
return (
<div className="App__list">
<h2 className="App__list--title">Missions</h2>
<ul className="App__list--items">
{dates.map((date) => (
<Date date={date} key={date} />
))}
</ul>
</div>
);
}
}
export default DateList;
날짜
import React, { Component } from 'react';
import Task from './Task';
class Date extends Component {
state = {
value: '',
task: '',
};
handleFormSubmit = (event) => {
event.preventDefault();
this.setState({
task: this.state.value,
});
};
handleAddTask = (event) => {
this.setState({
value: event.target.value,
});
};
render() {
const { date } = this.props;
return (
<li>
<div className="App__card--inner">
<h2>{date}</h2>
<form onSubmit={this.handleFormSubmit} className="App__card">
<div className="App__card--form">
<label>Add Your Task</label>
<textarea
rows="3"
cols="30"
placeholder="type here..."
value={this.state.value}
onChange={this.handleAddTask}
required
></textarea>
</div>
<div className="App__card--btn">
<button type="submit">Add Task</button>
</div>
</form>
<Task task={this.state.task} />
</div>
</li>
);
}
}
export default Date;
임무
import React from 'react';
const Task = (props) => {
return (
<div className="App__task">
<h3>Task</h3>
<p>{props.task}</p>
</div>
);
};
export default Task;
결승선
이제 사용자 인터페이스를 작은 블록으로 분해하여 다른 버전을 만드는 방법에 대한 지침이 있습니다.정적 버전은 우리의 데이터 모델만 필요하고 사용자 인터페이스와 상호작용을 추가하는 최종 버전을 보여줍니다.
나는 당신이 이 강좌를 읽은 후에react 응용 프로그램을 어떻게 구축하는지에 대해 즐거움을 느끼기를 바랍니다.
이 프로그램의 코드here를 찾을 수 있습니다.
응용 프로그램도 시작되고 실행됨here
읽어주셔서 감사합니다!
Reference
이 문제에 관하여("반응 중 사고"에 따라 응용 프로그램 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/pablopap/building-an-app-according-to-thinking-in-react-243e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)