摘要:方法一必須在這里綁定方法二使用屬性初始化器語法需要開啟以上方法三在使用時(shí)綁定方法四在回調(diào)函數(shù)中使用箭頭函數(shù)渲染的時(shí)候都會(huì)創(chuàng)建一個(gè)不同的回調(diào)函數(shù)。然而如果這個(gè)回調(diào)函數(shù)作為一個(gè)屬性值傳入低階組件,這些組件可能會(huì)進(jìn)行額外的重新渲染。
從16年夏天初學(xué)React,到17年正式投入到工作中使用,直到現(xiàn)在V16.2發(fā)版,React發(fā)生了巨大的變化,最近在工作中使用時(shí)遇到很多基礎(chǔ)不是非常清晰,借此再讀React官方文檔【中文】。
React核心的單向數(shù)據(jù)流、一切皆數(shù)據(jù)的state、不會(huì)改變的props,以及狀態(tài)提升等等經(jīng)常使用便不多總結(jié),需要的看官方文檔。
JSXJSX 本質(zhì)只是為 React.createElement(component, props, ...children)提供的語法糖!
1.React DOM 在渲染之前都被轉(zhuǎn)換成了字符串,它天生自帶防止 XSS 攻擊的屬性。
2.Babel 轉(zhuǎn)譯器會(huì)把 JSX 轉(zhuǎn)換成一個(gè)名為 React.createElement()的方法調(diào)用。在線babel編譯
以下兩段代碼等價(jià)(許多react的界面設(shè)計(jì)器通過這個(gè)原理,達(dá)到元數(shù)據(jù)轉(zhuǎn)化React元素,實(shí)現(xiàn)界面化編程!)
嵌套就是多個(gè)create方法的嵌套。
function hello() { returnHello,world!; }
"use strict"; function hello() { return React.createElement( "div", { className: "red" }, "Hello,", React.createElement( "span", null, "world!" ) ); }
3.JSX中的屬性是可以任何 {} 包裹的 JavaScript 表達(dá)式作為一個(gè)屬性值,不能使用if和for。
需要循環(huán)和條件渲染可以使用map、三目,或者使用if/for在jsx代碼之外!
//錯(cuò)誤的! class A extends React.Component { render() { returnReact.Component (組件){if(){}else{}};//原來還蒙蔽的不知道為什么錯(cuò)了0.0 } }
創(chuàng)建組件的四種方式:詳情對(duì)比參見或者react官網(wǎng)
React.Component 方式
class Greeting extends React.Component { render() { returnHello, {this.props.name}
; } }
ES5
var createReactClass = require("create-react-class"); var Greeting = createReactClass({ render: function() { returnHello, {this.props.name}
; } }); //或者使用react var Greeting = React.create({ render: function() { returnHello, {this.props.name}
; } });
函數(shù)式
const Button = ({ day, increment }) => { return () }
PureComponet
大多數(shù)情況下, 我們使用PureComponent能夠簡(jiǎn)化我們的代碼,并且提高性能,但是PureComponent的自動(dòng)為我們添加的shouldComponentUpate函數(shù),只是對(duì)props和state進(jìn)行淺比較(shadow comparison),當(dāng)props或者state本身是嵌套對(duì)象或數(shù)組等時(shí),淺比較并不能得到預(yù)期的結(jié)果,這會(huì)導(dǎo)致實(shí)際的props和state發(fā)生了變化,但組件卻沒有更新的問題。當(dāng)然還是有解決的方法的,所以建議還是少用。
事件處理事件綁定的四種方法:推薦使用第一第二種。
class Toggle extends React.Component { constructor(props) { {...} //方法一必須在這里綁定 this.handleClick1 = this.handleClick.bind(this); } handleClick1() { this... } //方法二使用【屬性初始化器語法】【需要開啟babel stage-0以上】 handleClick2=()=> { this... } render() { return (組合 vs 繼承//方法三在使用時(shí)綁定 //方法四在回調(diào)函數(shù)中使用 箭頭函數(shù) /** 渲染的時(shí)候都會(huì)創(chuàng)建一個(gè)不同的回調(diào)函數(shù)。在大多數(shù)情況下,這沒有問題。然而如果這個(gè)回調(diào)函數(shù)作為一個(gè)屬性值傳入低階組件,這些組件可能會(huì)進(jìn)行額外的重新渲染。我們通常建議在構(gòu)造函數(shù)中綁定或使用屬性初始化器語法來避免這類性能問題。 **/); } }
在React中不推薦使用繼承,不推薦繼承自定義Component。
//不推薦使用 class Parent extends React.Component { render() { return...; } } class A extends Parent { render() { return...; } }
//推薦使用 class A extends React.Component { render() { return不使用 ES6... ; } }
Component || create
defaultProps || getDefaultProps
constructor state || getInitialState
this bind || 不需要
class Greeting extends React.Component { constructor(props) { super(props); this.state = {count: props.initialCount}; this.handleClick = this.handleClick.bind(this); } handleClick() { alert(this.state.message); } render() { returnHello, {this.props.name}
; } } Greeting.defaultProps = { name: "Mary" };
var createReactClass = require("create-react-class"); var Greeting = createReactClass({ getInitialState: function() { return {count: this.props.initialCount}; }, getDefaultProps: function() { return { name: "Mary" }; }, handleClick: function() { alert(this.state.message); }, render: function() { //組件中的方法會(huì)自動(dòng)綁定至實(shí)例,不需要像上面那樣加 .bind(this) returnRefsHello, {this.props.name}
; } });
如果可以通過聲明式實(shí)現(xiàn),則盡量避免使用 refs。
不能在函數(shù)式組件上使用 ref 屬性,因?yàn)樗鼈儧]有實(shí)例
舊版 API:String 類型的 Refs,存在問題,可能會(huì)在未來移除,不推薦使用。
對(duì)父組件暴露refs,在父元素拿子元素
function CustomTextInput(props) { return (ReactDOM); } class Parent extends React.Component { //this.inputElement 就是CustomTextInput中的input render() { return (this.inputElement = el} /> ); } }
獲取一個(gè)DOM除了refs還有更加簡(jiǎn)單粗暴的方法findDOMNode。
findDOMNode 是用于操作底層DOM節(jié)點(diǎn)的備用方案。使用它的優(yōu)先級(jí)比refs更低?。?br>findDOMNode 只對(duì)掛載過的組件有效。
findDOMNode 不能用于函數(shù)式的組件中。
import ReactDOM from "react-dom"; ReactDOM.render( element, container, [callback]//不為人知的第三個(gè)參數(shù)??! ) ReactDOM.unmountComponentAtNode(container) ReactDOM.findDOMNode(component)不常用的新發(fā)現(xiàn)
空的 JSX 標(biāo)簽Fragments <>>或者
與運(yùn)算符 && true && expression 總是返回 expression,而 false && expression 總是返回 false。
阻止組件渲染常用null組件的 render 方法返回 null 并不會(huì)影響該組件生命周期方法的回調(diào)。例如,componentWillUpdate 和 componentDidUpdate 依然可以被調(diào)用。
### 高階組件HOC 使用高階組件(HOC)解決交叉問題
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/93317.html
摘要:在整個(gè)年,看到發(fā)布版增加了許多功能,包括新的生命周期方法新的上下文指針事件延遲函數(shù)和。它在等待渲染異步響應(yīng)時(shí)數(shù)據(jù),是延遲函數(shù)背后用來管理組件的代碼分割的。發(fā)布自第版開始將近年后,于年發(fā)布。 前端發(fā)展發(fā)展迅速,非常的快。 本文將回顧2018年一些重要的前端新聞,事件和 JavaScript 趨勢(shì)。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! showImg(ht...
摘要:楊冀龍是安全焦點(diǎn)民間白帽黑客組織核心成員,被浪潮之巔評(píng)為中國(guó)新一代黑客領(lǐng)軍人物之一他在本文中依次分享了對(duì)于黑客的定義如何從黑客成為一名安全創(chuàng)業(yè)者技術(shù)創(chuàng)業(yè)踩過的坑給技術(shù)創(chuàng)業(yè)者建議等內(nèi)容。 showImg(https://segmentfault.com/img/remote/1460000012377230?w=1240&h=796); 前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為...
摘要:虛擬的構(gòu)建在組件渲染到網(wǎng)頁前會(huì)執(zhí)行一個(gè)這個(gè)函數(shù)必須和一起使用該函數(shù)在組件更新完后會(huì)自動(dòng)執(zhí)行,第三個(gè)參數(shù)是的返回值階段發(fā)生在組件的刪除前,會(huì)自動(dòng)執(zhí)行,我們常用于清除組件之前被添加的還會(huì)繼續(xù)執(zhí)行的東西。 react 學(xué)習(xí)記錄 自己學(xué)習(xí),記錄便于后面回顧 基礎(chǔ)知識(shí)點(diǎn)的記憶: state與props state是組件自己的數(shù)據(jù),而props是父組件通過屬性賦值方式將其傳送給組件;這樣達(dá)到了,...
摘要:本文是年框架回顧系列的最后的一篇文章,主要介紹的后端框架情況。葡萄城公司成立于年,是全球領(lǐng)先的集開發(fā)工具商業(yè)智能解決方案管理系統(tǒng)設(shè)計(jì)工具于一身的軟件和服務(wù)提供商。 本文是2017年 JavaScript 框架回顧系列的最后的一篇文章,主要介紹 JavaScript 的后端框架情況。 showImg(https://segmentfault.com/img/bV2TPd?w=735&h=...
閱讀 2821·2021-11-17 09:33
閱讀 3158·2021-10-25 09:44
閱讀 1268·2021-10-11 10:59
閱讀 2489·2021-09-27 13:34
閱讀 2961·2021-09-07 10:19
閱讀 2207·2019-08-29 18:46
閱讀 1595·2019-08-29 12:55
閱讀 984·2019-08-23 17:11