成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

閱讀ant-design源碼_Button

xinhaip / 626人閱讀

摘要:組件整體組件主要是通過(guò)改變狀態(tài),從而渲染時(shí)應(yīng)用不同來(lái)改變外觀檢查是否只有個(gè)中文字符,例如提交,檢查到則會(huì)變更中的屬性,再次渲染時(shí)就會(huì)變?yōu)樘峤恢袝?huì)檢查是否需要狀態(tài)渲染的中綁定了,通過(guò)方法延遲執(zhí)行動(dòng)畫(huà)注意學(xué)習(xí)使用和的使用使用與使用的比較,前者更

Button組件

整體

Button組件

主要是通過(guò)改變state狀態(tài),從而渲染時(shí)應(yīng)用不同className來(lái)改變外觀

檢查是否只有2個(gè)中文字符,例如 "提交", 檢查到則會(huì)變更state中的屬性,再次渲染時(shí)就會(huì)變?yōu)?"提 交"

componentWillReceiveProps中會(huì)檢查是否需要loading狀態(tài)

渲染的dom中綁定了click,通過(guò)setTimeout方法延遲執(zhí)行click動(dòng)畫(huà)

注意

學(xué)習(xí)使用classNames和omit

React.cloneElement的使用

使用React.children與使用this.props.children的比較,前者更準(zhǔn)確

每次render通過(guò)改變className來(lái)改變外觀和動(dòng)畫(huà)

源碼注釋
import * as React from "react";
import { findDOMNode } from "react-dom";
import PropTypes from "prop-types";
import classNames from "classnames";
import omit from "omit.js";
import Icon from "../icon";
import Group from "./button-group";

//2個(gè)中文字符
const rxTwoCNChar = /^[u4e00-u9fa5]{2}$/;
const isTwoCNChar = rxTwoCNChar.test.bind(rxTwoCNChar);
function isString(str: any) {
  return typeof str === "string";
}

// Insert one space between two chinese characters automatically.

function insertSpace(child: React.ReactChild, needInserted: boolean) {
  // Check the child if is undefined or null.
  if (child == null) {
    return;
  }
  const SPACE = needInserted ? " " : "";
  // strictNullChecks oops.
  // child是react的組件并且組件的子元素只有2個(gè)中文字符
  // 如果是點(diǎn)擊,child是一個(gè)obj,里面type為"span"
  if (typeof child !== "string" && typeof child !== "number" &&
    isString(child.type) && isTwoCNChar(child.props.children)) {
    // 克隆組件(element,[props],[...children])
    // 也可以寫(xiě)成
    // {child.props.children.split("").join(SPACE)}
    return React.cloneElement(child, {},
      child.props.children.split("").join(SPACE));
  }
  // child是字符串
  if (typeof child === "string") {
    // child只有2個(gè)中文字符
    if (isTwoCNChar(child)) {
      child = child.split("").join(SPACE);
    }
    return {child};
  }
  return child;
}

export type ButtonType = "default" | "primary" | "ghost" | "dashed" | "danger";
export type ButtonShape = "circle" | "circle-outline";
export type ButtonSize = "small" | "default" | "large";

export interface BaseButtonProps {
  type?: ButtonType;
  htmlType?: string;
  icon?: string;
  shape?: ButtonShape;
  size?: ButtonSize;
  loading?: boolean | { delay?: number };
  prefixCls?: string;
  className?: string;
  ghost?: boolean;
}

export type AnchorButtonProps = BaseButtonProps & React.AnchorHTMLAttributes;

export type NativeButtonProps = BaseButtonProps & React.ButtonHTMLAttributes;

export type ButtonProps = AnchorButtonProps | NativeButtonProps;

export default class Button extends React.Component {
  static Group: typeof Group;
  static __ANT_BUTTON = true;

  static defaultProps = {
    prefixCls: "ant-btn",
    loading: false,
    ghost: false,
  };

  static propTypes = {
    type: PropTypes.string,
    shape: PropTypes.oneOf(["circle", "circle-outline"]),
    size: PropTypes.oneOf(["large", "default", "small"]),
    htmlType: PropTypes.oneOf(["submit", "button", "reset"]),
    onClick: PropTypes.func,
    loading: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
    className: PropTypes.string,
    icon: PropTypes.string,
  };

  timeout: number;
  delayTimeout: number;

  constructor(props: ButtonProps) {
    super(props);
    this.state = {
      loading: props.loading,
      clicked: false,
      hasTwoCNChar: false,
    };
  }

  //每次創(chuàng)建時(shí)
  componentDidMount() {
    //判斷子元素是否只有2個(gè)字符,并且更改state
    this.fixTwoCNChar();
  }

  //每次prop改變
  componentWillReceiveProps(nextProps: ButtonProps) {
    const currentLoading = this.props.loading;
    const loading = nextProps.loading;

    //如果傳了loading
    if (currentLoading) {
      //先清空之前l(fā)oading的計(jì)時(shí)器
      clearTimeout(this.delayTimeout);
    }
    //loading不為布爾值,并且存在delay屬性(自定義loadidng延遲)
    if (typeof loading !== "boolean" && loading && loading.delay) {
      this.delayTimeout = window.setTimeout(() => this.setState({ loading }), loading.delay);
    } else {
      //未自定義loading延遲
      this.setState({ loading });
    }
  }

  //每次更新render后,檢查是否2中文字符
  componentDidUpdate() {
    this.fixTwoCNChar();
  }

  componentWillUnmount() {
    if (this.timeout) {
      clearTimeout(this.timeout);
    }
    if (this.delayTimeout) {
      clearTimeout(this.delayTimeout);
    }
  }

  //判斷子元素是否只有2個(gè)字符,并且將判斷結(jié)果給state.hasTwoCNChar
  fixTwoCNChar() {
    // Fix for HOC usage like 
    //返回已經(jīng)裝在的DOM(這里可能是或者

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108075.html

相關(guān)文章

  • 組件庫(kù)按需加載 借助babel-plugin-import實(shí)現(xiàn)

    摘要:對(duì)于大中型前端項(xiàng)目為了解耦與復(fù)用,更多的公司會(huì)選擇自己封裝組件庫(kù),那么一次引入整個(gè)組件庫(kù)必然導(dǎo)致項(xiàng)目過(guò)大,如何按需加載則必須要做前世的插件原理項(xiàng)目地址在轉(zhuǎn)碼的時(shí)候,把整個(gè)庫(kù)的引用,變?yōu)榫唧w模塊的引用。 對(duì)于大中型前端項(xiàng)目為了解耦與復(fù)用,更多的公司會(huì)選擇自己封裝組件庫(kù),那么一次引入整個(gè)組件庫(kù)必然導(dǎo)致項(xiàng)目過(guò)大,如何按需加載則必須要做 前世 ant-design的babel插件babel-p...

    zhichangterry 評(píng)論0 收藏0
  • React + MobX 入門(mén)及實(shí)例(二)

    摘要:在上一章入門(mén)及實(shí)例一應(yīng)用實(shí)例的基礎(chǔ)上增加優(yōu)化界面增加后臺(tái)框架,操作。刪除選中項(xiàng)時(shí),一定要在刪除成功后將置空,否則在下次選擇時(shí)會(huì)選中已刪除的項(xiàng),雖然沒(méi)有元素但可能會(huì)影響其他一些操作。中設(shè)置跨域訪問(wèn)實(shí)際是對(duì)進(jìn)行匹配。 在上一章 React + MobX 入門(mén)及實(shí)例(一) 應(yīng)用實(shí)例TodoList的基礎(chǔ)上 增加ant-design優(yōu)化界面 增加后臺(tái)express框架,mongoose操作。...

    Eidesen 評(píng)論0 收藏0
  • 剖析 React 源碼:先熱個(gè)身

    摘要:我們先來(lái)看下這個(gè)函數(shù)的一些神奇用法對(duì)于上述代碼,也就是函數(shù)來(lái)說(shuō)返回值是。不管你第二個(gè)參數(shù)的函數(shù)返回值是幾維嵌套數(shù)組,函數(shù)都能幫你攤平到一維數(shù)組,并且每次遍歷后返回的數(shù)組中的元素個(gè)數(shù)代表了同一個(gè)節(jié)點(diǎn)需要復(fù)制幾次。這是我的 React 源碼解讀課的第一篇文章,首先來(lái)說(shuō)說(shuō)為啥要寫(xiě)這個(gè)系列文章: 現(xiàn)在工作中基本都用 React 了,由此想了解下內(nèi)部原理 市面上 Vue 的源碼解讀數(shù)不勝數(shù),但是反觀...

    sean 評(píng)論0 收藏0
  • TypeScript 、React、 Redux和Ant-Design的最佳實(shí)踐

    摘要:使用官方的的另外一種版本和一起使用自動(dòng)配置了一個(gè)項(xiàng)目支持。需要的依賴(lài)都在文件中。帶靜態(tài)類(lèi)型檢驗(yàn),現(xiàn)在的第三方包基本上源碼都是,方便查看調(diào)試。大型項(xiàng)目首選和結(jié)合,代碼調(diào)試維護(hù)起來(lái)極其方便。 showImg(https://segmentfault.com/img/bVbrTKz?w=1400&h=930); 阿特伍德定律,指的是any application that can be wr...

    wangbinke 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<