摘要:組件整體組件主要是通過改變狀態,從而渲染時應用不同來改變外觀檢查是否只有個中文字符,例如提交,檢查到則會變更中的屬性,再次渲染時就會變為提交中會檢查是否需要狀態渲染的中綁定了,通過方法延遲執行動畫注意學習使用和的使用使用與使用的比較,前者更
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
摘要:對于大中型前端項目為了解耦與復用,更多的公司會選擇自己封裝組件庫,那么一次引入整個組件庫必然導致項目過大,如何按需加載則必須要做前世的插件原理項目地址在轉碼的時候,把整個庫的引用,變為具體模塊的引用。 對于大中型前端項目為了解耦與復用,更多的公司會選擇自己封裝組件庫,那么一次引入整個組件庫必然導致項目過大,如何按需加載則必須要做 前世 ant-design的babel插件babel-p...
摘要:在上一章入門及實例一應用實例的基礎上增加優化界面增加后臺框架,操作。刪除選中項時,一定要在刪除成功后將置空,否則在下次選擇時會選中已刪除的項,雖然沒有元素但可能會影響其他一些操作。中設置跨域訪問實際是對進行匹配。 在上一章 React + MobX 入門及實例(一) 應用實例TodoList的基礎上 增加ant-design優化界面 增加后臺express框架,mongoose操作。...
摘要:我們先來看下這個函數的一些神奇用法對于上述代碼,也就是函數來說返回值是。不管你第二個參數的函數返回值是幾維嵌套數組,函數都能幫你攤平到一維數組,并且每次遍歷后返回的數組中的元素個數代表了同一個節點需要復制幾次。這是我的 React 源碼解讀課的第一篇文章,首先來說說為啥要寫這個系列文章: 現在工作中基本都用 React 了,由此想了解下內部原理 市面上 Vue 的源碼解讀數不勝數,但是反觀...
摘要:使用官方的的另外一種版本和一起使用自動配置了一個項目支持。需要的依賴都在文件中。帶靜態類型檢驗,現在的第三方包基本上源碼都是,方便查看調試。大型項目首選和結合,代碼調試維護起來極其方便。 showImg(https://segmentfault.com/img/bVbrTKz?w=1400&h=930); 阿特伍德定律,指的是any application that can be wr...
閱讀 3267·2021-09-23 11:55
閱讀 2600·2021-09-13 10:33
閱讀 1665·2019-08-30 15:54
閱讀 3095·2019-08-30 15:54
閱讀 2363·2019-08-30 10:59
閱讀 2369·2019-08-29 17:08
閱讀 1804·2019-08-29 13:16
閱讀 3589·2019-08-26 12:25