🎆前言
在各种平台上找了一些教程跟着搓了一个最基础的react的todolist,分享一些在跟着敲的过程中的经验,仅供参考。
✨组成部分
todolist的组成部分应当包括
- 标题
- 输入框
- 提交按钮
- todolist item
✨初始化React项目
- 官网安装node.js
- 安装命令:npm i -g create-react-app
- 创建react项目:create-react-app 项目名称
- 启动react项目,进入刚创建好的react项目 npm start
✨Todolist.js
import React,{ Component} from "react";
导入react组件中的默认组件,并命令为React,用{}引入react文件中的成员组件Component
创建Component组件,初始化inputValue和list数组,以及使用export输出组件
class Todolist extends Component{
constructor(props){
super(props)
this.state={
inputValue:'',
list:[]
}
}
}
export default Todolist;
先建立页面基本构成要素,一个输入框,一个按钮,下方显示的列表
render(){
return(
<div>
<h1>Todolist</h1>
<div><input/></div>
<button>提交</button>
<ul>
<li>111</li>
</ul>
</div>
)
}
需要的方法有
- handleInputChange:监听使得值输入框内的文字随之改变
- handleBtnClick:点击按钮时提交到列表,并且输入框内的文字变成空白
- handleItemDelete:点击列表文字时删除该条目
handleInputChange(e){
this.setState({
inputValue:e.target.value
})
}
handleBtnClick(){
this.setState({
list:[...this.state.list,this.state.inputValue],
inputValue:""
})
}
handleItemDelete(index){
const list=[...this.state.list]
list.splice(index,1)
this.setState({
list:list
})
}
- 将handleInputChange绑定到input输入框中,同时输入框的值为state中的inputValue。
- 将handleBtnClick绑定到button按钮上。
render(){
return(
<div>
<h1>Todolist</h1>
<div>
<input value={this.state.inputValue}
onChange={this.handleInputChange.bind(this)}/>
</div>
<button onClick={this.handleBtnClick.bind(this)}>
提交
</button>
<ul>
<li>111</li>
</ul>
</div>
)
}
export default Todolist;
再添加点击条目删除的方法,因为其state未知使用 Array.map() 渲染未知数量的元素this.state.list.map((item,index)=>{})
render(){
return(
<div>
<h1>Todolist</h1>
<div>
<input value={this.state.inputValue}
onChange={this.handleInputChange.bind(this)}/>
</div>
<button onClick={this.handleBtnClick.bind(this)}>
提交
</button>
<ul>{
this.state.list.map((item,index)=>{
return(
<li onClick={this.handleItemDelete.bind(this,index)} >
{item}
</li>
)
})
}
</ul>
</div>
)
}
export default Todolist;
✨index.js
导入组件,挂载
import React from 'react';
import ReactDOM from 'react-dom';
import App from './Todolist';
ReactDOM.render(<App />,document.getElementById('root'));
✨style.css
以下是css的样式,写完引入父组件import"./style.css";
ul{
list-style: none;
padding: 0;
}
.input{
background-color:rgb(39 120 157 / 32%);
}
.Component{
background-color: gray;
}
🎇需要拆分组件的情况
将TodoItem单独拆分的情况,在父组件中将数据传递给子组件
render(){
return(
<div>
<h1>Todolist</h1>
<div>
<input value={this.state.inputValue}
onChange={this.handleInputChange.bind(this)}/>
</div>
<button onClick={this.handleBtnClick.bind(this)}>
提交
</button>
<ul>
{
this.state.list.map((item,index)=>{
return(
<TodoItem
content={item}
index={index}
itemDelete={this.handleItemDelete.bind(this)}/>
)
})
}
</ul>
</div>
)
}
export default Todolist;
子组件,handleClick接收父组件传递下来的值完成删除,注意写完后把它引入父组件
import TodoItem from"./TodoItem";
import React, { Component } from "react";
class TodoItem extends Component {
render() {
return(
<div onClick={this.handleClick.bind(this)}>
{this.props.content}
</div>
)
}
handleClick() {
this.props.itemDelete(this.props.index)
}
}
export default TodoItem;