61.1-注册功能实现和高阶组件装饰器

有苦,自我释放;有乐,欣然品尝。风吹雨打知生活,苦尽甘来懂人生。其实人生,就是一种感受,一场历练,一次懂得!

1. 前端注册功能实现

在service/user.js中增加reg注册函数

import axios from 'axios';
// import { resolve } from '../../webpack.config.dev';
import { observable } from 'mobx';
import store from 'store';

store.addPlugin(require('store/plugins/expire'));

export default class UserService {
    @observable loggedin = false;

    login(email,password){
        // 从view层发来邮箱和密码,转发给后台服务器;
        console.log(name)
        console.log(email)
        console.log(password)
        console.log('__________________')

        axios.post('/api/user/login', {
            email:email,
            password:password
          })
          .then(response => {
            console.log(1,response);
            console.log(response.data);
            const {token, user}=response.data;
            console.log(token);
            console.log(user);
            store.set('token',token,new Date().getTime()+18888*3600*10000);
            this.loggedin = true;
          })
          .catch(error => {
            console.log(2,error);
            this.loggedin = false;
          });
    }


    reg(email,name,password){
        // 从view层发来邮箱和密码,转发给后台服务器;
        console.log(email)
        console.log(name)
        console.log(password)
        console.log('__________________')

        axios.post('/api/user/login', {
            email:email,
            password:password
          })
          .then(response => {
            console.log(1,response);
            console.log(response.data);
            const {token, user}=response.data;
            console.log(token);
            console.log(user);
            store.set('token',token,new Date().getTime()+18888*3600*10000);
            this.loggedin = true;
          })
          .catch(error => {
            console.log(2,error);
            this.loggedin = false;
          });
    }
}

Reg组件类

import React from 'react';
import '../css/login.css';
import { Link, Redirect } from 'react-router-dom';
import { userService as service} from '../service/user';
import { observable } from 'mobx';
import { observer } from 'mobx-react';

export default class Reg extends React.Component {
  render() {
    return <_Reg service={service} />;
  }
}

class _Reg extends React.Component {
    validatePwd(pwd1,pwd2) {
      return pwd1.value == pwd2.value;
    }

    handleClick(event){
      event.preventDefault();
      const [email,name,password,confirm] = event.target.form;
      console.log(email);
      console.log(name);
      console.log(password);
      console.log(confirm);
      if (this.validatePwd(password,confirm))
        this.props.service.reg(email.value,name.value,password.value);
      else {
        console.log('error~~~~~~~~~~~~~~~')
      }
    }


    render() {
      console.log('reg page',this.props.service.loggedin)
      if (this.props.service.loggedin) return <Redirect to="/" />;
        return (<div className="login-page">
        <div className="form">
        <form className="login-form">
            <input type="text" placeholder="邮箱"/>
            <input type="text" placeholder="用户名"/>
            <input type="password" placeholder="密码"/>
            <input type="password" placeholder="确认密码"/>
            <button onClick={this.handleClick.bind(this)}>注册</button>
            <p className="message">已注册? <Link to="/login">请登录</Link></p>
          </form>
        </div>
      </div>);
    }
}

测试
重新登录,登录成功后,点击注册链接,看看是否跳转到了首页?或先注册,注册成功后,点击登录,看看是否还
能登录?
原因是什么?
原因就是构造并使用了不同的User Service实例。如何使用同一个?
在service/user.js中导出唯一的User Service实例即可, 其他模块直接导入并使用这个实例即可

// service/user.js
class UserService {
// 此处省略
}
const userService = new UserService();
export {userService};

2. Ant Design

Ant Design 蚂蚁金服开源的 React UI 库。
官网 https://ant.design/index-cn
官方文档 https://ant.design/docs/react/introduce-cn

安装
$ npm install antd

使用
import { List } from 'antd'; // 加载
import 'antd/lib/list/style/css'; // 加载 CSS
ReactDOM.render(<List />, mountNode);

每一种组件的详细使用例子,官网都有,需要时查阅官方文档即可

3. 信息显示

网页开发中,不管操作成功与否,有很多提示信息,目前信息都是控制台输出,用户看不到。
使用Antd的message组件显示友好信息提示。
在service/user.js中增加一个被观察对象

import axios from 'axios';
// import { resolve } from '../../webpack.config.dev';
import { observable } from 'mobx';
import store from 'store';

// 过期插件;
store.addPlugin(require('store/plugins/expire'));

export default class UserService {
    @observable loggedin = false;
    @observable errMsg = ''; // 错误信息;

    login(email,password){
        // 从view层发来邮箱和密码,转发给后台服务器;
        console.log(name)
        console.log(email)
        console.log(password)
        console.log('__________________')

        axios.post('/api/user/login', {
            email:email,
            password:password
          })
          .then(response => {
            console.log(1,response);
            console.log(response.data);
            const {token, user}=response.data;
            console.log(token);
            console.log(user);
            store.set('token',token,new Date().getTime()+18888*3600*10000);
            this.loggedin = true;
          })
          .catch(error => {
            console.log(2,error);
            this.loggedin = false;
            this.errMsg = '用户名密码错误';
          });
    }

    reg(email,name,password){
        // 从view层发来邮箱和密码,转发给后台服务器;
        console.log(email)
        console.log(name)
        console.log(password)
        console.log('__________________')

        axios.post('/api/user/login', {
            email:email,
            password:password
          })
          .then(response => {
            console.log(1,response);
            console.log(response.data);
            const {token, user}=response.data;
            console.log(token);
            console.log(user);
            store.set('token',token,new Date().getTime()+18888*3600*10000);
            this.loggedin = true;
          })
          .catch(error => {
            console.log(2,error);
            this.loggedin = false;
            this.errMsg = '注册失败';
          });
    }
}

const userService = new UserService();
export{userService};

component/_Login 组件,增加Antd的message组件;

// component/login.js
import React from 'react';
import '../css/login.css';
import { Link } from 'react-router-dom';
import { userService as service} from '../service/user';
import { observable } from 'mobx';
import { observer } from 'mobx-react';
import {message} from 'antd';
import 'antd/lib/message/style';

export default class Login extends React.Component {
  render() {
    return <_Login service={service} />;
  }
}

@observer
class _Login extends React.Component {
  constructor (props) {
    super(props);
  }

  handleClick(event){
    event.preventDefault;
    const [email,password] = event.target.form;  
    this.props.service.login(email.value,password.value,this);   //async
    // this.setState({'ret':ret})
  }

  render() {
    console.log('login render+++++++++++++++++++++')
    console.log('login page',this.props.service.loggedin)
    if (this.props.service.loggedin) return <Redirect to="/" />;
    // if (this.props.service.errMsg){
    //   message.info(this.props.service.errMsg,5, ()=>this.props.service.errMsg='');
    // }
    let em = this.props.service.errMsg;

    return (<div className="login-page">

    <div className="form">
      <form className="login-form">
        <input type="text" placeholder="邮箱" />
        <input type="password" placeholder="密码" />
        <button onClick={this.handleClick.bind(this)}>登录</button>
        <p className="message">未注册? <Link to="/reg">创建账号</Link></p>
      </form>
    </div>
  </div>);
  }

// 消息清除;
  componentDidUpdate(prevprops,prevState){
    if (prevprops.service.errMsg){
      message.info(prevprops.service.errMsg,5, ()=>prevprops.service.errMsg='');
    }
  }
}

上面代码执行到用户登录失败时,浏览器控制台会抛出一个警告

Warning:_render New Root Component() :Render methods should be a pure function of props and state;
triggering nested component updates from render is not allowed.If necessary, trigger neste
updates in component Did Update.Check the render method of_Login.

// 消息清除;
  componentDidUpdate(prevprops,prevState){
    if (prevprops.service.errMsg){
      message.info(prevprops.service.errMsg,5, ()=>prevprops.service.errMsg='');
    }
  }
}

component/_Reg组件同样增加message组件

import React from 'react';
import '../css/login.css';
import { Link, Redirect } from 'react-router-dom';
import { userService as service} from '../service/user';
import { observable } from 'mobx';
import { observer } from 'mobx-react';

export default class Reg extends React.Component {
  render() {
    return <_Reg service={service} />;
  }
}

class _Reg extends React.Component {
    validatePwd(pwd1,pwd2) {
      return pwd1.value == pwd2.value;
    }

    handleClick(event){
      event.preventDefault();
      const [email,name,password,confirm] = event.target.form;
      console.log(email);
      console.log(name);
      console.log(password);
      console.log(confirm);
      if (this.validatePwd(password,confirm))
        this.props.service.reg(email.value,name.value,password.value);
      else {
        console.log('error~~~~~~~~~~~~~~~')
      }
    }


  render() {
    console.log('reg page',this.props.service.loggedin)
    if (this.props.service.loggedin) return <Redirect to="/" />;
    let em = this.props.service.errMsg;
    return (<div className="login-page">
      <div className="form">
      <form className="login-form">
          <input type="text" placeholder="邮箱"/>
          <input type="text" placeholder="用户名"/>
          <input type="password" placeholder="密码"/>
          <input type="password" placeholder="确认密码"/>
          <button onClick={this.handleClick.bind(this)}>注册</button>
          <p className="message">已注册? <Link to="/login">请登录</Link></p>
        </form>
      </div>
    </div>);
  }

  componentDidUpdate(prevprops,prevState){
    if (prevprops.service.errMsg){
      message.info(prevprops.service.errMsg,5, ()=>prevprops.service.errMsg='');
    }
  }
}
1. js函数变型
// function inject(obj) {
//    return function (Comp) {
//     return class extends React.Component {
//       render() {
//         return <Comp {...obj} />;
//       }
//     };
//   }
// }

const injec=obj => Comp =>
  class extends React.Component {
     render() {
       return <Comp {...obj} />;
     }
   };

const injec = obj => Comp => props => <Comp {...obj}{...props} />;

import React from 'react';
import '../css/login.css';
import { Link } from 'react-router-dom';
import { userService as service} from '../service/user';
import { observable } from 'mobx';
import { observer, inject } from 'mobx-react';
import {message} from 'antd';
import 'antd/lib/message/style';
import {inject} from "../utils";

@inject({service})
@observer
export default class _Login extends React.Component {
  constructor (props) {
    super(props);
  }

  handleClick(event){
    event.preventDefault;
    const [email,password] = event.target.form;  
    this.props.service.login(email.value,password.value,this);   //async
    // this.setState({'ret':ret})
  }

  render() {
    console.log('login render+++++++++++++++++++++')
    console.log('login page',this.props.service.loggedin)
    if (this.props.service.loggedin) return <Redirect to="/" />;
    // if (this.props.service.errMsg){
    //   message.info(this.props.service.errMsg,5, ()=>this.props.service.errMsg='');
    // }
    let em = this.props.service.errMsg;

    return (<div className="login-page">

    <div className="form">
      <form className="login-form">
        <input type="text" placeholder="邮箱" />
        <input type="password" placeholder="密码" />
        <button onClick={this.handleClick.bind(this)}>登录</button>
        <p className="message">未注册? <Link to="/reg">创建账号</Link></p>
      </form>
    </div>
  </div>);
  }
  componentDidUpdate(prevprops,prevState){
    if (prevprops.service.errMsg){
      message.info(prevprops.service.errMsg,5, ()=>prevprops.service.errMsg='');
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。