国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

閱讀ant-design源碼_Button

xinhaip / 620人閱讀

摘要:組件整體組件主要是通過改變狀態,從而渲染時應用不同來改變外觀檢查是否只有個中文字符,例如提交,檢查到則會變更中的屬性,再次渲染時就會變為提交中會檢查是否需要狀態渲染的中綁定了,通過方法延遲執行動畫注意學習使用和的使用使用與使用的比較,前者更

Button組件

整體

Button組件

主要是通過改變state狀態,從而渲染時應用不同className來改變外觀

檢查是否只有2個中文字符,例如 "提交", 檢查到則會變更state中的屬性,再次渲染時就會變為 "提 交"

componentWillReceiveProps中會檢查是否需要loading狀態

渲染的dom中綁定了click,通過setTimeout方法延遲執行click動畫

注意

學習使用classNames和omit

React.cloneElement的使用

使用React.children與使用this.props.children的比較,前者更準確

每次render通過改變className來改變外觀和動畫

源碼注釋
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個中文字符
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個中文字符
  // 如果是點擊,child是一個obj,里面type為"span"
  if (typeof child !== "string" && typeof child !== "number" &&
    isString(child.type) && isTwoCNChar(child.props.children)) {
    // 克隆組件(element,[props],[...children])
    // 也可以寫成
    // {child.props.children.split("").join(SPACE)}
    return React.cloneElement(child, {},
      child.props.children.split("").join(SPACE));
  }
  // child是字符串
  if (typeof child === "string") {
    // child只有2個中文字符
    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,
    };
  }

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

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

    //如果傳了loading
    if (currentLoading) {
      //先清空之前loading的計時器
      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個字符,并且將判斷結果給state.hasTwoCNChar
  fixTwoCNChar() {
    // Fix for HOC usage like 
    //返回已經裝在的DOM(這里可能是或者

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108075.html

相關文章

  • 組件庫按需加載 借助babel-plugin-import實現

    摘要:對于大中型前端項目為了解耦與復用,更多的公司會選擇自己封裝組件庫,那么一次引入整個組件庫必然導致項目過大,如何按需加載則必須要做前世的插件原理項目地址在轉碼的時候,把整個庫的引用,變為具體模塊的引用。 對于大中型前端項目為了解耦與復用,更多的公司會選擇自己封裝組件庫,那么一次引入整個組件庫必然導致項目過大,如何按需加載則必須要做 前世 ant-design的babel插件babel-p...

    zhichangterry 評論0 收藏0
  • React + MobX 入門及實例(二)

    摘要:在上一章入門及實例一應用實例的基礎上增加優化界面增加后臺框架,操作。刪除選中項時,一定要在刪除成功后將置空,否則在下次選擇時會選中已刪除的項,雖然沒有元素但可能會影響其他一些操作。中設置跨域訪問實際是對進行匹配。 在上一章 React + MobX 入門及實例(一) 應用實例TodoList的基礎上 增加ant-design優化界面 增加后臺express框架,mongoose操作。...

    Eidesen 評論0 收藏0
  • 剖析 React 源碼:先熱個身

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

    sean 評論0 收藏0
  • TypeScript 、React、 Redux和Ant-Design的最佳實踐

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

    wangbinke 評論0 收藏0

發表評論

0條評論

xinhaip

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<