内容简介:工作中使用vue居多,今天使用 react 来实现一个简易版的 todolist,顺便熟悉一下antd。2.引入 react-app-rewired 并修改 package.json 里的启动配置修改package.json
工作中使用vue居多,今天使用 react 来实现一个简易版的 todolist,顺便熟悉一下antd。 项目地址
1. 使用create-react-app创建项目
npx create-react-app antd-todolist 复制代码
2. 安装antd并配置按需加载和less
- 安装antd
yarn add antd 复制代码
2.引入 react-app-rewired 并修改 package.json 里的启动配置
yarn add react-app-rewired customize-cra 复制代码
修改package.json
"scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test" }, 复制代码
- 配置
- 使用babel-plugin-import用于按需加载
yarn add babel-plugin-import 复制代码
- 引入less
yarn add less less-loader 复制代码
- 新建config-overrides.js用来修改默认配置
const { override, fixBabelImports, addLessLoader } = require('customize-cra'); module.exports = override( fixBabelImports('import', { libraryName: 'antd', libraryDirectory: 'es', style: true, }), addLessLoader({ javascriptEnabled: true }), ); 复制代码
- 在App.js里面引入button组件
import React from 'react'; import {Button} from 'antd' function App() { return ( <div className="App"> <Button type="primary">点击</Button> </div> ); } export default App; 复制代码
- 重启
yarn start 复制代码
3. todoList
- 新建项目结构
2. 新建初始数据data.js
const list = [ { id: '123', content: '周一活动ABC', isComplete: false }, { id: 'abc', content: '周二活动ABC', isComplete: true }, { id: '345', content: '周三活动ABC', isComplete: false } ] export default list; 复制代码
- TodoList.js 引入antd组件基础布局TodoList.js,父子组件之间的数据传递通过this.props
import React, { Component } from 'react'; import { Layout } from 'antd'; import Form from './components/Form'; import DataList from './components/DataList'; import Footer from './components/Footer'; import datas from './data' import './todolist.less' const { Header, Content} = Layout; class TodoList extends Component { constructor (props) { super(props) this.state = { list: [] } } componentDidMount () { this.setState({ list: datas }) } deleteItem (id) { let deleteIndex = datas.findIndex(item => { return item.id === id }) datas.splice(deleteIndex, 1) this.setState({ list: datas }) } changeItem (id) { let changeIndex = datas.findIndex(item => { return item.id === id }) datas[changeIndex].isComplete = !datas[changeIndex].isComplete this.setState({ list: datas }) } handleSearchItem(value) { let newList = datas.filter(item => { return item.content.indexOf(value) !== -1 }) this.setState({ list: newList }) } addItem (item) { datas.push(item) this.setState({ list: datas }) } render () { return ( <Layout className="todolist-layout"> <Header> <h3 className="logo">TodoList</h3> </Header> <Content className="todolist-content"> <Form searchItem={value => this.handleSearchItem(value)}></Form> <DataList list={this.state.list} deleteItem={id => this.deleteItem(id)} changeItem={id => this.changeItem(id)}></DataList> <Footer addItem={item => this.addItem(item)}></Footer> </Content> </Layout> ) } } export default TodoList; 复制代码
- TodoItem.js 具体的数据展示组件,分为内容展示,状态显示,删除等内容。双击改变状态,点击删除按钮删除该条数据
import React, { Component } from 'react'; import { Typography, Button } from 'antd'; import './TodoItem.less' const { Text } = Typography; class TodoItem extends Component { handleDeleteItem (id) { this.props.deleteItem(id) } handleChangeItem (id) { this.props.changeItem(id) } render () { let {content, isComplete, id} = this.props return ( <div className="item-container" onDoubleClick={() => this.handleChangeItem(id)} style={{cursor: 'pointer'}}> <Text delete={isComplete}>{content}</Text> <Button type="primary" icon="delete" onClick={() => this.handleDeleteItem(id)}></Button> </div> ) } } export default TodoItem; 复制代码
- DataList.js 列表组件
import React, { Component } from 'react'; import TodoItem from './TodoItem' import { List } from 'antd'; class DataList extends Component { deleteItem (id) { this.props.deleteItem(id) } changeItem (id) { this.props.changeItem(id) } render () { let data = this.props.list return ( <List bordered dataSource={data} renderItem={item => ( <List.Item> <TodoItem deleteItem={id => this.deleteItem(id)} changeItem={id => this.changeItem(id)} {...item}/> </List.Item> )} /> ) } } export default DataList; 复制代码
- Form.js 搜索组件,在输入框输入内容点击按钮进行查看,实际是按条件对数据进行过滤
import React, { Component } from 'react'; import { Input } from 'antd'; const Search = Input.Search; class Form extends Component { handeChange (value) { this.props.searchItem(value) } render () { return ( <Search placeholder="请输入搜索内容" style={{marginBottom: '8px'}} onSearch={value => this.handeChange(value)} enterButton /> ) } } export default Form; 复制代码
- Footer.js 显示新增按钮,点击后显示输入框,确认提交后,添加数据,输入框消失显示新增按钮
import React, { Component } from 'react'; import { Button } from 'antd'; import { Input } from 'antd'; class Footer extends Component { constructor(props) { super(props) this.state = { isAdd: false, addContent: '' } } handleClick () { this.setState({ isAdd: true }) } handleChange (e) { this.setState({ addContent: e.target.value }) } handleConfirm () { if(!this.state.addContent) return let item = { id: new Date(), content: this.state.addContent, isComplete: false } this.props.addItem(item) this.setState({ isAdd: false }) } render () { let addBtn = <Button type="primary" onClick={this.handleClick.bind(this)}>新增</Button> let addComponent = <div style={{display: 'flex'}}> <Input onChange={e => this.handleChange(e)} style={{marginRight: '10px'}}/> <Button type="primary" onClick={this.handleConfirm.bind(this)}>确认</Button> </div> let component = this.state.isAdd ? addComponent : addBtn return ( <div style={{marginTop: '10px'}}> {component} </div> ) } } export default Footer; 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- php如何实现session,自己实现session,laravel如何实现session
- AOP如何实现及实现原理
- webpack 实现 HMR 及其实现原理
- Docker实现原理之 - OverlayFS实现原理
- 为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?
- 自己实现集合框架(十):顺序栈的实现
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
疯传:让你的产品、思想、行为像病毒一样入侵(全新修订版)
[美] 乔纳•伯杰(Jonah Berger) / 乔迪、王晋 / 电子工业出版社 / 2016-6 / 68.00
是什么让事物变得流行? 从买轿车、买衣服、吃三明治,到给孩子取名字,你是否知道为什么某些产品会大卖,某些故事被人们口口相传,某些电子邮件更易被转发,或者某些视频链接被疯狂地点击,某些谣言更具传播力,某些思想和行为像病毒一样入侵你的大脑……这本书将为你揭示这些口口相传和社会传播背后的科学秘密,并且告诉你如何将产品、思想、行为设计成具有感染力和传播力的内容。 无论你是大公司的管理者,还是努......一起来看看 《疯传:让你的产品、思想、行为像病毒一样入侵(全新修订版)》 这本书的介绍吧!
URL 编码/解码
URL 编码/解码
Markdown 在线编辑器
Markdown 在线编辑器