• react入门:todo应用


    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>To-Do</title>
        <style>
          .to-do-page {
            position: absolute;
            top: 0;
            right: 0;
            left: 0;
            bottom: 0;
            margin: auto;
             400px;
            height: 400px;
          }
          header {
            font-size: 30px;
            font-weight: 200;
            font-family: fantasy;
            text-align: center;
            margin-bottom: 10px;
          }
          main {
            border: 1px solid #dedede;
            border-radius: 10px;
            min-height: 200px;
          }
          footer {
            text-align: center;
            margin-top: 10px;
          }
          .add-form {
            height: 40px;
            background: #fff;
            border: 4px solid rgb(74, 179, 74);
          }
          .add-ipt {
            height: 36px;
             300px;
            border: none;
            outline: medium;
            padding-left: 20px;
          }
          .add-btn {
            height: 40px;
             70px;
            background: rgb(74, 179, 74);
            color: white;
            border: none;
            font-weight: bold;
            outline: medium;
          }
          .list-item {
            margin: 10px;
            font-size: 16px;
            font-weight: bold;
          }
          .list-item input {
            height: 25px;
            font-weight: bold;
            opacity: 0.6;
            padding-left: 10px;
          }
          .list-item:hover {
            cursor: pointer;
          }
          .operate-area span {
            display: inline-block;
            color: #7676d9;
            margin-left: 10px;
          }
          .operate-area span:hover {
            cursor: pointer;
          }
        </style>
      </head>
    
      <body>
        <div id="app"></div>
        <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
        <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
        <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
        <script type="text/babel">
          //  总页面
          class ToDoPage extends React.Component {
            render() {
              return (
                <div className='to-do-page'>
                  <Header />
                  <Main />
                  <Footer />
                </div>
              );
            }
          }
          //  页头
          class Header extends React.Component {
            render() {
              return <header>To-Do</header>;
            }
          }
          // 内容
          class Main extends React.Component {
            render() {
              return (
                <main>
                  <ToDoBox />
                </main>
              );
            }
          }
          //  页脚
          class Footer extends React.Component {
            render() {
              return <footer> ©2019 仅做示例使用</footer>;
            }
          }
          class ToDoBox extends React.Component {
            constructor(props) {
              super(props);
              this.state = {
                toDoList: [
                  {
                    id: 0,
                    content: '学习'
                  },
                  {
                    id: 1,
                    content: '晚餐'
                  }
                ]
              };
              this.update = this.update.bind(this);
            }
            //  更新toDoList对象
            update(data) {
              this.setState({
                toDoList: data
              });
            }
            render() {
              return (
                <div>
                  <AddAffairForm toDoList={this.state.toDoList} update={this.update} />
                  <ToDoList toDoList={this.state.toDoList} update={this.update} />
                </div>
              );
            }
          }
          // 添加表单
          class AddAffairForm extends React.Component {
            constructor(props) {
              super(props);
              this.state = {
                affair: ''
              };
              this.toDoList = this.props.toDoList;
              this.handleChange = this.handleChange.bind(this);
              this.addToDoList = this.addToDoList.bind(this);
            }
            handleChange(e) {
              this.setState({
                affair: e.target.value
              });
            }
            addToDoList(e) {
              e.preventDefault();
              if (this.state.affair.trim().length < 1) {
                alert('不能不输入哦!');
              } else {
                this.toDoList = [...this.toDoList, { id: this.toDoList.length, content: this.state.affair }];
                this.props.update && this.props.update(this.toDoList);
                this.setState({
                  affair: ''
                });
              }
            }
            render() {
              let addAffairForm = (
                <form onSubmit={this.addToDoList} className='add-form'>
                  <input
                    className='add-ipt'
                    type='text'
                    placeholder='今天做点什么呢?'
                    value={this.state.affair}
                    onChange={this.handleChange}
                    required
                  />
                  <input type='submit' value='加入计划' onSubmit={this.addToDoList} className='add-btn' />
                </form>
              );
              return addAffairForm;
            }
          }
          //  列表
          class ToDoList extends React.Component {
            constructor(props) {
              super(props);
              this.delete = this.delete.bind(this);
              this.update = this.update.bind(this);
            }
            delete(id) {
              let toDoList = [...this.props.toDoList];
              toDoList = toDoList.filter(item => item.id !== id);
              this.props.update && this.props.update(toDoList);
            }
            update(data) {
              let toDoList = [...this.props.toDoList];
              toDoList.map(item => {
                if (item.id === data.id) {
                  item.content = data.content;
                }
              });
              this.props.update && this.props.update(toDoList);
            }
            render() {
              return (
                <ul className='list'>
                  {this.props.toDoList.map((item, index) => {
                    return <ToDoListItem toDoListItem={item} key={item.id} delete={this.delete} update={this.update} />;
                  })}
                </ul>
              );
            }
          }
          //  列表项
          class ToDoListItem extends React.Component {
            constructor(props) {
              super(props);
              this.state = {
                item: Object.assign({}, this.props.toDoListItem),
                isDisplay: false,
                isEdit: false
              };
              this.toggleDisplay = this.toggleDisplay.bind(this);
              this.handleChange = this.handleChange.bind(this);
              this.cancelEdit = this.cancelEdit.bind(this);
              this.handleEdit = this.handleEdit.bind(this);
              this.finishAffair = this.finishAffair.bind(this);
              this.confirmEdit = this.confirmEdit.bind(this);
            }
            toggleDisplay(e) {
              this.setState({
                isDisplay: !this.state.isDisplay
              });
            }
            handleChange(e) {
              const item = this.state.item;
              item.content = e.target.value;
              this.setState({
                item: item
              });
            }
            cancelEdit() {
              const item = Object.assign({}, this.props.toDoListItem);
              this.setState({
                item: item,
                isEdit: !this.state.isEdit
              });
            }
            handleEdit() {
              this.setState({
                isEdit: !this.state.isEdit
              });
            }
            finishAffair(e) {
              e.stopPropagation();
              this.props.delete && this.props.delete(this.state.item.id);
            }
            confirmEdit(e) {
              this.props.update && this.props.update(this.state.item);
              this.handleEdit();
            }
            render() {
              let todoListItem = null;
              if (this.state.isEdit) {
                todoListItem = (
                  <li className='list-item'>
                    <input value={this.state.item.content} placeholder='请输入' onChange={this.handleChange} />
                    <span className='operate-area'>
                      <span onClick={this.confirmEdit}>确定</span>
                      <span onClick={this.cancelEdit}>取消</span>
                    </span>
                  </li>
                );
              } else {
                todoListItem = (
                  <li className='list-item' onClick={this.toggleDisplay}>
                    {this.props.toDoListItem.content}
                    <span
                      style={this.state.isDisplay ? { display: 'inline-block' } : { display: 'none' }}
                      className='operate-area'
                    >
                      <span onClick={this.handleEdit}>修改</span>
                      <span onClick={this.finishAffair}>完成</span>
                    </span>
                  </li>
                );
              }
              return todoListItem;
            }
          }
          const app = document.getElementById('app');
          ReactDOM.render(<ToDoPage />, app);
        </script>
      </body>
    </html>
    
    
  • 相关阅读:
    POJ 2352 &amp;&amp; HDU 1541 Stars (树状数组)
    SSH三大框架的工作原理及流程
    稀疏表示
    Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁
    [面经] 南京SAP面试(上)
    JAVA数组的定义及用法
    花指令
    计算机认证考试种类
    《C语言编写 学生成绩管理系统》
    spice for openstack
  • 原文地址:https://www.cnblogs.com/yejingping/p/11200873.html
Copyright © 2020-2023  润新知