1.创建 Todolist.js
组件
import React from 'react';
class TodoList extends React.Component{
//构造方法
constructor(props){
super(props);
this.state = {
list: [
'learn html',
'learn css',
'learn react',
'learn vue'
]
}
}
//按钮点击事件方法
handleBtnClick(){
this.setState({
list: [...this.state.list,'hello world'] //...为展开运算符,将this.state.list内容放到当前的list中
});
}
render(){
return (
<div>
<div>
<input type="text"></input>
<button onClick={this.handleBtnClick.bind(this)}>添加</button>
</div>
<ul>
{/* key属性为唯一值,没有该属性,浏览器会报警告信息,在做添加操作时会出bug */}
{this.state.list.map((item,index) => <li key={index}>{item}</li>)}
</ul>
</div>
);
}
}
export default TodoList;
引用组件
import React from 'react';
import ReactDOM from 'react-dom';
import TodoList from './TodoList';
ReactDOM.render(<TodoList />, document.getElementById('root'));
2.添加列表项功能
代码示例:
import React from 'react';
class TodoList extends React.Component{
//构造方法
constructor(props){
super(props);
this.state = {
list: [], //展示列表
inputValue:'' //记录输入框的值
}
}
按钮点击事件方法
handleBtnClick(){
this.setState({
list: [...this.state.list,this.state.inputValue], //...为展开运算符,将this.state.list内容放到当前的list中
inputValue: '' //点击添加按钮,清空输入框
});
}
//输入框输入事件方法
handleInputChange(e){
this.setState({
inputValue: e.target.value
});
}
render(){
return (
<div>
<div>
<input value={this.state.inputValue} onChange={this.handleInputChange.bind(this)}></input>
<button onClick={this.handleBtnClick.bind(this)}>添加</button>
</div>
<ul>
{this.state.list.map((item,index) => <li key={index}>{item}</li>)}
</ul>
</div>
);
}
}
export default TodoList;
3.删除列表元素
删除列表元素代码:
import React from 'react';
class TodoList extends React.Component{
//构造方法
constructor(props){
super(props);
this.state = {
list: [], //展示列表
inputValue:'' //记录输入框的值
}
}
按钮点击事件方法
handleBtnClick(){
this.setState({
list: [...this.state.list,this.state.inputValue], //...为展开运算符,将this.state.list内容放到当前的list中
inputValue: '' //点击添加按钮,清空输入框
});
}
//输入框输入事件方法
handleInputChange(e){
this.setState({
inputValue: e.target.value
});
}
//点击展示列表事件方法,用于删除展示元素
handleItemClick(index){
const list = [...this.state.list];
list.splice(index,1);
this.setState({
list: list
});
}
render(){
return (
<div>
<div>
<input value={this.state.inputValue} onChange={this.handleInputChange.bind(this)}></input>
<button onClick={this.handleBtnClick.bind(this)}>添加</button>
</div>
<ul>
{this.state.list.map((item,index) => {
return <li onClick={this.handleItemClick.bind(this,index)} key={index}>
{item}
</li>
})}
</ul>
</div>
);
}
}
export default TodoList;
4.使用组件化实现删除功能
创建子组件 TodoItem.js
import React from 'react';
class TodoItem extends React.Component{
//点击元素删除的方法
//子组件如果想和父组件通信,子组件要调用父组件传递过来的方法
handleDelete(){
//调用父组件的方法,向父组件传值
this.props.delete(this.props.index);
}
render(){
return (
<div onClick={this.handleDelete.bind(this)}>
{/* 子组件通过props接收父组件传递过来的参数 */}
{this.props.content}
</div>
);
}
}
export default TodoItem;
在父组件 TodoList.js
中调用子组件
import React from 'react';
import TodoItem from './TodoItem';
class TodoList extends React.Component{
//构造方法
constructor(props){
super(props);
this.state = {
list: [], //展示列表
inputValue:'' //记录输入框的值
}
}
按钮点击事件方法
handleBtnClick(){
this.setState({
list: [...this.state.list,this.state.inputValue], //...为展开运算符,将this.state.list内容放到当前的list中
inputValue: '' //点击添加按钮,清空输入框
});
}
//输入框输入事件方法
handleInputChange(e){
this.setState({
inputValue: e.target.value
});
}
//点击元素删除的方法,该方法是用来接收子组件的传值
handelDeleteItem(index){
const list = [...this.state.list];
list.splice(index,1);
this.setState({
list: list
});
}
render(){
return (
<div>
<div>
<input value={this.state.inputValue} onChange={this.handleInputChange.bind(this)}></input>
<button onClick={this.handleBtnClick.bind(this)}>添加</button>
</div>
<ul>
{this.state.list.map((item,index) => {
//父组件通过属性的形式向子组件传递参数
return <TodoItem
delete={this.handelDeleteItem.bind(this)}
key={index}
content={item}
index={index}>
</TodoItem>
})}
</ul>
</div>
);
}
}
export default TodoList;
5.代码优化
TodoItem.js
代码优化:
import React from 'react';
class TodoItem extends React.Component{
//构造方法
constructor(props){
super(props);
this.handleDelete = this.handleDelete.bind(this);
}
//点击元素删除的方法
//子组件如果想和父组件通信,子组件要调用父组件传递过来的方法
handleDelete(){
const { handelDelete , index } = this.props;
//调用父组件的方法,向父组件传值
handelDelete(index);
}
render(){
const { content } = this.props;
return (
<div onClick={this.handleDelete}>{content}</div>
);
}
}
export default TodoItem;
TodoList.js
代码优化:
import React from 'react';
import TodoItem from './TodoItem';
class TodoList extends React.Component{
//构造方法
constructor(props){
super(props);
this.state = {
list: [], //展示列表
inputValue:'' //记录输入框的值
}
this.handleInputChange = this.handleInputChange.bind(this);
this.handleBtnClick = this.handleBtnClick.bind(this);
this.handelDeleteItem = this.handelDeleteItem.bind(this);
}
按钮点击事件方法
handleBtnClick(){
this.setState({
list: [...this.state.list,this.state.inputValue], //...为展开运算符,将this.state.list内容放到当前的list中
inputValue: '' //点击添加按钮,清空输入框
});
}
//输入框输入事件方法
handleInputChange(e){
this.setState({
inputValue: e.target.value
});
}
//点击元素删除的方法,该方法是用来接收子组件的传值
handelDeleteItem(index){
const list = [...this.state.list];
list.splice(index,1);
this.setState({
list: list
});
}
//遍历方法
getTodoItems(){
return (
this.state.list.map((item,index) => {
//父组件通过属性的形式向子组件传递参数
return <TodoItem
handelDelete={this.handelDeleteItem}
key={index}
content={item}
index={index} />
})
);
}
render(){
return (
<div>
<div>
<input value={this.state.inputValue} onChange={this.handleInputChange}></input>
<button onClick={this.handleBtnClick}>添加</button>
</div>
<ul>
{this.getTodoItems()}
</ul>
</div>
);
}
}
export default TodoList;
6.使用CSS样式修饰
方法一:使用style
属性
代码示例:
<button style={{background:'blue',color:'#fff'}} onClick={this.handleBtnClick}>
添加
</button>
方法二:使用className
属性
创建 style.css
文件
.red-btn{
background-color: red;
color: #ffffff;
}
在 index.js
入口文件引入 css
import './style.css';
在组件中使用 className
属性
<button className='red-btn' onClick={this.handleBtnClick}>添加</button>
7.JSX
代码优化
render()
方法 return
的 JSX
代码需要在最外层使用一个标签包裹,如果不想在页面中显示最外层的这个标签,可以使用 <React.Fragment>
标签替代,代码示例:
render(){
return (
<React.Fragment>
<div>
<input />
<button>添加</button>
</div>
<ul>
{this.getTodoItems()}
</ul>
</React.Fragment>
);
}
也可以在引入组件时直接引入类,在使用时就不需要用 React
调用
引入
import React,{Component,Fragment} from 'react';
class TodoList extends Component{
render(){
return (
<Fragment>
<div>
<input />
<button>添加</button>
</div>
<ul>
{this.getTodoItems()}
</ul>
</Fragment>
);
}
}
export default TodoList;