摘要:組件整體組件主要是通過(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
摘要:對(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...
摘要:在上一章入門(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操作。...
摘要:我們先來(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ù),但是反觀...
摘要:使用官方的的另外一種版本和一起使用自動(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...
閱讀 3271·2021-09-23 11:55
閱讀 2614·2021-09-13 10:33
閱讀 1670·2019-08-30 15:54
閱讀 3099·2019-08-30 15:54
閱讀 2367·2019-08-30 10:59
閱讀 2374·2019-08-29 17:08
閱讀 1807·2019-08-29 13:16
閱讀 3590·2019-08-26 12:25