美文网首页工具癖让前端飞前端开发那些事
少写css, 早下班! Antd完成todo-list样式布局

少写css, 早下班! Antd完成todo-list样式布局

作者: zhaoolee | 来源:发表于2018-07-12 08:50 被阅读334次
  • Antd是一个UI组件库, 与React非常搭
  • 善用UI库, 可以节省写css样式的时间
  • 如果我们把写css的时间压缩一大半, 或许就可以早点下班了~

关于Antd

antd怎么用?

  • 安装antd
npm install antd -S
  • 在react组件中引入antd及其部分组件
import 'antd/dist/antd.css';
import { Input, List, Tag, Switch} from 'antd';
  • 在react组件中使用antd(以标签为例)
{/*这里的item是一个数组*/}
<Tag color="orange" style={{position: "absolute", right: 0}}>创建日期: {item[2]}</Tag>

用antd写一个待办清单

  • 自动添加创建日期
  • 支持任务的开启关闭(点击switch组件或点击文字)
  • 支持删除任务(在关闭状态下点击任务文字)

核心组件源码

import React, { Component } from 'react';
import './App.css';
import 'antd/dist/antd.css';
import { Input, List, Tag, Switch} from 'antd';


class App extends Component {

  constructor(props){
    super(props);
    this.state = {
      list: [],
      inputValue: ''
    }
    this.addContent = this.addContent.bind(this);
    this.handleInputValue = this.handleInputValue.bind(this);
    this.removeItem = this.removeItem.bind(this);
    this.handleNewTodoKeyDown = this.handleNewTodoKeyDown.bind(this);
    this.getCurrentDate = this.getCurrentDate.bind(this);
  }

  componentDidMount(){
    // 页面加载后自动聚焦
    this.nameInput.focus();
  }

  // 将输入框内容添加到列表
  addContent() {
    let tmpValue =  this.state.inputValue
    // 内容为空无法添加
    if (tmpValue === "") {
      return
    }
    // 获取当前时间
    let tmpDate = this.getCurrentDate()

    let tmpList = JSON.parse(JSON.stringify(this.state.list));
    tmpList.unshift([tmpValue, 0, tmpDate])
    // 清空输入框内容
    this.setState({inputValue: ''});
    // 重新渲染列表
    this.setState({list: tmpList})
    // 重新聚焦
    this.nameInput.focus();

  }

  // 将实时输入的内容进行绑定
  handleInputValue(event) {
    let tmpInputValue = event.target.value;
    this.setState({inputValue: tmpInputValue});
  }

  // 获取当前时间的dom
  getCurrentDate(){
    // 添加创建日期
    let dt = new Date()
    let year = dt.getFullYear();
    let month = dt.getMonth();
    let day = dt.getDate();
    let hour = dt.getHours();
    let minute = dt.getMinutes();
    let second= dt.getSeconds();
    // 将月份加1
    month = month + 1;
    if (month <= 9){month = "0" + month;}
    if (day <= 9){day = "0" + day;}
    if (hour <= 9){hour = "0" + hour;}
    if (minute <= 9){minute = "0" + minute;}
    if (second <= 9){second = "0" + second;}
    let creteData = year+ "年" + month+ "月" + day+ "日" + hour+ "时" + minute+ "分" + second+ "秒";
    return creteData

  }

  // 移除被点击的内容
  removeItem(index){
    let tmpListdata = JSON.parse(JSON.stringify(this.state.list))
    // 切割出一个元素的数组
    let tmpItem = tmpListdata.splice(index, 1);
    // 被点击的元素索引加1
    tmpItem[0][1] += 1;
    // 一次划线
    if (tmpItem[0][1] === 1){
      // 将元素补回
      tmpListdata.splice(index, 0, ...tmpItem);
    }
      // 更新列表数据
    this.setState({list: tmpListdata});
  }

  // 捕捉回车动作
  handleNewTodoKeyDown(event) {
    let ENTER_KEY = 13;
    if (event.keyCode === ENTER_KEY) {
      this.addContent();
    }
  }
  
  // 处理开关按钮
  handleSwitch(index){
    let tmpList = JSON.parse(JSON.stringify(this.state.list));
    tmpList[index][1] = tmpList[index][1] ? 0 : 1;
    this.setState({list: tmpList});
  } 

  render() {
  return (
    <div className="App">
      <Input 
      style = {{marginTop: 20, marginBottom: 20}}
      className="app-input" size="large" placeholder="请输入待办事项(回车添加)" 
      onChange={this.handleInputValue.bind(this)} 
      value={this.state.inputValue}
      onKeyDown={this.handleNewTodoKeyDown}
      ref={(input) => { this.nameInput = input; }} />


      <List
      size="large"
      bordered
      dataSource={this.state.list}
      style={{color: "#4091F7", fontWeight: "bold"}}
      renderItem={
        (item, index) => (
          <List.Item>
          <Switch style={{marginRight: 20}} onChange={this.handleSwitch.bind(this, index)} checked = {item[1] ? false : true} />
          <Tag color="orange" style={{position: "absolute", right: 0}}>创建日期: {item[2]}</Tag>
          <div onClick={this.removeItem.bind(this, index)} style={{cursor:"pointer"}}>
          {item[1] ? <div style={{textDecoration:"line-through"}}>{item[0]}</div> : <div>{item[0]}</div>}
          </div>
          </List.Item>)
      }
      />

    </div>
  );
  }
}

export default App;

为便于管理, 相关资源整合到一张独立的帖子,链接如下:
http://www.jianshu.com/p/4f28e1ae08b1

相关文章

  • 少写css, 早下班! Antd完成todo-list样式布局

    Antd是一个UI组件库, 与React非常搭 善用UI库, 可以节省写css样式的时间 如果我们把写css的时间...

  • [前端开发]前端React开发工作笔记

    开启CSS-Module下覆盖antd的某个样式 引入的 antd 组件类名没有被 CSS Modules 转化,...

  • css

    css基础css选择器css常见样式1css常见样式2CSS布局上CSS布局下flex布局塔防小游戏flex布局青...

  • Missing semi-colon or unrecognis

    写react 时候 关于less的 css 文件 @import "~antd/dist/antd.css"...

  • eject后使用babel-plugin-import按需引入a

    在文件顶部引入 antd/dist/antd.css实际上加载了全部的 antd 组件的样式(对前端性能是个隐患)...

  • Ant Design 样式使用css module

    #### antd的less配置不开启css module,但是代码里面想用css module加载样式,方便局部...

  • CSS第一节

    什么是CSS 定义:重叠样式表,控制页面和布局 CSS样式 所有的标签都有一个默认样式 内联式 在行内写st...

  • CSS初级

    css样式表 css选择器(简单,复杂) css属性 css布局 CSS样式表(内联方式,内部样式表,外部样式表)...

  • antd按需引入样式无效

    最近在项目中上antd时,发现了一个如果同时引入css modules和按需引入antd,antd样式无效的问题。...

  • CSS显示模式

    div 和 span 标签 div标签:配合CSS完成网页的基本布局,设置样式 span标签:配合CSS来修改网页...

网友评论

  • 星期六1111:之前用过这个库,很好用,基本不需要多少css 的知识,上手非常容易
  • 你家旭哥:老板想要他自己的样式 你还得自己写
    zhaoolee:@你家旭哥 抄九写一

本文标题:少写css, 早下班! Antd完成todo-list样式布局

本文链接:https://www.haomeiwen.com/subject/etclpftx.html