摘要:在中必須調(diào)用方法,因為子類沒有自己的對象,而是繼承父類的對象,然后對其進行加工而就代表了父類的構(gòu)造函數(shù)。雖然代表了父類的構(gòu)造函數(shù),但是返回的是子類的實例,即內(nèi)部的指的是,因此在這里相當(dāng)于。要求,子類的構(gòu)造函數(shù)必須執(zhí)行一次函數(shù),否則會報錯。
1.class
ES6 提供了更接近傳統(tǒng)語言的寫法,引入了 Class(類)這個概念,作為對象的模板。通過class關(guān)鍵字,可以定義類。
基本上,ES6 的class可以看作只是一個語法糖,它的絕大部分功能,ES5 都可以做到,新的class寫法只是讓對象原型的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法而已
特點
1.類的所有方法都定義在類的prototype屬性上面
class Point { constructor() { // ... } } == Point.prototype = { constructor() {}, };
2.Point.prototype.constructor === Point // true
3.定義“類”的方法的時候,前面不需要加上function這個關(guān)鍵字,直接把函數(shù)定義放進去了就可以了
4.類不存在變量提升(hoist),這一點與 ES5 完全不同。
5.類的方法內(nèi)部如果含有this,它默認指向類的實例
6.如果在一個方法前,加上static關(guān)鍵字,就表示該方法不會被實例繼承,而是直接通過類來調(diào)用,這就稱為“靜 態(tài)方法”。
7.寫法
ES5寫法
function Point(x, y) { this.x = x; this.y = y; } Point.prototype.toString = function () { return "(" + this.x + ", " + this.y + ")"; }; var p = new Point(1, 2);
ES6
class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return "(" + this.x + ", " + this.y + ")"; } }2.constructor( )——構(gòu)造方法
這是ES6對類的默認方法,通過 new 命令生成對象實例時自動調(diào)用該方法。并且,該方法是類中必須有的,如果沒有顯示定義,則會默認添加空的constructor( )方法。
1.constructor方法默認返回實例對象(即this)
class Point { constructor(x, y) { this.x = x; this.y = y; } } point.hasOwnProperty("x") // true
2.super( ) ——繼承
在class方法中,繼承是使用 extends 關(guān)鍵字來實現(xiàn)的。子類 必須 在 constructor( )調(diào)用 super( )方法,否則新建實例時會報錯。 在 constructor 中必須調(diào)用 super 方法,因為子類沒有自己的 this 對象,而是繼承父類的 this 對象 ,然后對其進行加工,而 super 就代表了父類的構(gòu)造函數(shù)。super 雖然代表了父類 A 的構(gòu)造函數(shù), 但是返回的是子類 B 的實例,即 super 內(nèi)部的 this 指的是 B,因此 super() 在這里相當(dāng)于 A.prototype.constructor.call(this, props)。 class A {} class B extends A { constructor() { super(); // ES6 要求,子類的構(gòu)造函數(shù)必須執(zhí)行一次 super 函數(shù),否則會報錯。 } }
3.如果你在constructor中要使用this.props,就必須給super加參數(shù):super(props);
3.ref 和 React.js 中的 DOM 操作順帶一提的是,其實可以給組件標(biāo)簽也加上 ref
this.input = input} />//input為獲取的節(jié)點4.react組件可內(nèi)嵌組件或者節(jié)點原理
嵌套的結(jié)構(gòu)在組件內(nèi)部都可以通過 props.children 獲取到 class Card extends Component { render () { return (5.默認配置 defaultProps&&給組件的配置參數(shù)加上類型驗證) } } ReactDOM.render({this.props.children[0]}{this.props.children[1]}, document.getElementById("root") ) children[0]children[1]
class LikeButton extends Component { static defaultProps = { likedText: "取消", unlikedText: "點贊" } static propTypes = { comment: PropTypes.object//const { comment } = this.props } static propTypes = { comment: PropTypes.object.isRequired } }6.react中bind(this)的理解
bind返回值是由指定的this值和初始化參數(shù)改造的原函數(shù)拷貝
在JSX中傳遞的事件不是一個字符串,而是一個函數(shù)(如:onClick={this.handleClick}),此時onClick即是中間變量,所以處理函數(shù)中的this指向會丟失。解決這個問題就是給調(diào)用函數(shù)時bind(this),從而使得無論事件處理函數(shù)如何傳遞,this指向都是當(dāng)前實例化對象。
當(dāng)然,如果不想使用bind(this),我們可以在聲明函數(shù)時使用箭頭函數(shù)將函數(shù)內(nèi)容返回給一個變量,并在調(diào)用時直接使用this.變量名即可
1 2 constructor(props) { super(props); this.state = { }; this.handleClick=this.handleClick.bind(this) } 37.高階組件
高階組件是一個函數(shù)(而不是組件),它接受一個組件作為參數(shù),返回一個新的組件。這個新的組件會使用你傳給它的組件作為子組件
import React, { Component } from "react" export default (WrappedComponent, name) => { class NewComponent extends Component { constructor () { super() this.state = { data: null } } componentWillMount () { let data = localStorage.getItem(name) this.setState({ data }) } render () { return} } return NewComponent }
import wrapWithLoadData from "./wrapWithLoadData" class InputWithUserName extends Component { render () { return } } InputWithUserName = wrapWithLoadData(InputWithUserName, "username") export default InputWithUserName8.export&&import
模塊功能主要由兩個命令構(gòu)成:export和import。export命令用于規(guī)定模塊的對外接口,import命令用于輸入其他模塊提供的功能。一個模塊就是一個獨立的文件。該文件內(nèi)部的所有變量,外部無法獲取。如果你希望外部能夠讀取模塊內(nèi)部的某個變量,就必須使用export關(guān)鍵字輸出該變量
1.export命令規(guī)定的是對外的接口,必須與模塊內(nèi)部的變量建立一一對應(yīng)關(guān)系
2.export語句輸出的接口,與其對應(yīng)的值是動態(tài)綁定關(guān)系,即通過該接口,可以取到模塊內(nèi)部實時的值
3.注意輸出時{}的使用表明其是一個接口,不用則為值會報錯
//export var year = 1958; var firstName = "Michael"; var lastName = "Jackson"; var year = 1958; export {firstName, lastName, year}; ---------- // 報錯 export 1; // 報錯 var m = 1; export m; ---------- // 寫法一 export var m = 1; // 寫法二 var m = 1; export {m}; // 寫法三 var n = 1; export {n as m}; //函數(shù) function f() {} export {f};
4.import命令接受一對大括號,里面指定要從其他模塊導(dǎo)入的變量名。大括號里面的變量名,必須與被導(dǎo)入模塊(profile.js)對外接口的名稱相同
5.如果想為輸入的變量重新取一個名字,import命令要使用as關(guān)鍵字,將輸入的變量重命名
6.import命令輸入的變量都是只讀的,因為它的本質(zhì)是輸入接口。也就是說,不允許在加載模塊的腳本里面,改寫
接口
7.注意,import命令具有提升效果,會提升到整個模塊的頭部,首先執(zhí)行
8.import是靜態(tài)執(zhí)行,所以不能使用表達式和變量
import { lastName as surname } from "./profile.js"; import {myMethod} from "util";//util是模塊文件名,必須通過配置,告訴引擎怎么取到這個模塊 import "lodash";//import語句會執(zhí)行所加載的模塊9.模塊的整體加載
除了指定加載某個輸出值,還可以使用整體加載,即用星號(*)指定一個對象,所有輸出值都加載在這個對象上面。
// circle.js export function area(radius) { return Math.PI * radius * radius; } export function circumference(radius) { return 2 * Math.PI * radius; }
import * as circle from "./circle"; console.log("圓面積:" + circle.area(4)); console.log("圓周長:" + circle.circumference(14));10.export default命令,為模塊指定默認輸出
// export-default.js export default function () { console.log("foo"); } // import-default.js import customName from "./export-default"; customName(); // "foo"
1.使用export default時,對應(yīng)的import語句不需要使用大括號
// 第一組 export default function crc32() { // 輸出 // ... } import crc32 from "crc32"; // 輸入 // 第二組 export function crc32() { // 輸出 // ... }; import {crc32} from "crc32"; // 輸入 //結(jié)合使用 import _, { each, forEach } from "lodash";
2.export default命令其實只是輸出一個叫做default的變量,所以它后面不能跟變量聲明語句
// 正確 export var a = 1; // 正確 var a = 1; export default a; // 錯誤 export default var a = 1;11.解構(gòu)賦值
本質(zhì)上,這種寫法屬于“模式匹配”,只要等號兩邊的模式相同,左邊的變量就會被賦予對應(yīng)的值。下面是一些使用嵌套數(shù)組進行解構(gòu)的例子
let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3 let [ , , third] = ["foo", "bar", "baz"]; third // "baz" let [x, , y] = [1, 2, 3]; x // 1 y // 3 let [head, ...tail] = [1, 2, 3, 4]; head // 1 tail // [2, 3, 4] let [x, y, ...z] = ["a"]; x // "a" y // undefined z // []
1.如果等號的右邊不是數(shù)組(或者嚴格地說,不是可遍歷的結(jié)構(gòu),參見《Iterator》一章),那么將會報錯
// 報錯 let [foo] = 1; let [foo] = false; let [foo] = NaN;
2.解構(gòu)賦值允許指定默認值
let [foo = true] = []; foo // true let [x, y = "b"] = ["a"]; // x="a", y="b" let [x, y = "b"] = ["a", undefined]; // x="a", y="b"
3.解構(gòu)不僅可以用于數(shù)組,還可以用于對象
//簡易模型 let { bar, foo } = { foo: "aaa", bar: "bbb" }; foo // "aaa" bar // "bbb" let { baz } = { foo: "aaa", bar: "bbb" }; baz // undefined
//基本模型 var robotA = { name: "Bender" }; var robotB = { name: "Flexo" }; var { name: nameA } = robotA; var { name: nameB } = robotB; nameA//"Bender" nameB//"Flexo"
//多重解構(gòu) const node = { loc: { start: { line: 1, column: 5 } } }; let { loc, loc: { start }, loc: { start: { line }} } = node; line // 1 loc // Object {start: Object} start // Object {line: 1, column: 5}
//默認值 var {x, y = 5} = {x: 1}; x // 1 y // 5 var { message: msg = "Something went wrong" } = {};
//JavaScript 引擎會將{x}理解成一個代碼塊,從而發(fā)生語法錯誤 //只有不將大括號寫在行首,避免 JavaScript 將其解釋為代碼塊,才能解決這個問題 let x; ({x} = {x: 1});
//字符解構(gòu) const [a, b, c, d, e] = "hello"; a // "h" b // "e" c // "l" d // "l" e // "o"12箭頭函數(shù)
箭頭函數(shù)沒有 this,所以需要通過查找作用域鏈來確定 this 的值。這就意味著如果箭頭函數(shù)被非箭頭函數(shù)包含,this 綁定的就是最近一層非箭頭函數(shù)的 this。
沒有 arguments
不能通過 new 關(guān)鍵字調(diào)用
沒有原型
沒有 super
格式1:多個參數(shù) (param1, param2, …, paramN) => { statements } // statements應(yīng)該有return 語句 (param1, param2, …, paramN) => expression //相當(dāng)于 return expression 格式2:一個參數(shù) (singleParam) => { statements } singleParam => { statements } //可以去掉括號 格式3:沒有參數(shù) () => { statements } 格式4:返回對象 params => ({foo: bar}) 格式5:支持擴展符號 (param1, param2, ...rest) => { statements } 格式6:支持默認值 (param1 = defaultValue1, param2, …, paramN = defaultValueN) => { statements } 格式7:支持解構(gòu)賦值 var f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c; f(); // 613.Decorator修飾器應(yīng)用//@connect原理
修飾器是一個對類進行處理的函數(shù)。修飾器函數(shù)的第一個參數(shù),就是所要修飾的目標(biāo)類。@是語法糖
1.類的修飾
function decorator(target) { target.isTestable = true; } @decorator class A {} // 等同于 class A {} A = decorator(A) || A; A.isTestable//true
2.修飾器帶參數(shù)
function testable(isTestable) { return function(target) { target.isTestable = isTestable; } } @testable(true) class MyTestableClass {} MyTestableClass.isTestable // true
3.與redux庫結(jié)合
class MyReactComponent extends React.Component {} export default connect(mapStateToProps, mapDispatchToProps)(MyReactComponent); //connect(mapStateToProps, mapDispatchToProps)返回一個函數(shù) //加上()即(MyReactComponent),再次執(zhí)行函數(shù),傳入一個組件返回一個被修飾的組件 == @connect(mapStateToProps, mapDispatchToProps)//將props導(dǎo)入到被修飾的組件上去 export default class MyReactComponent extends React.Component {}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/108873.html
摘要:我對很有興趣,但是我發(fā)現(xiàn)想寫不容易。于是我馬上動手,有了這個,本意是自己用,現(xiàn)在也推薦給大家,也希望大家積極指出不足,提出建議,當(dāng)然如果有更好的方案,也可以推薦給我。特點使用了,這樣可以用來書寫代碼。 我對 react 很有興趣,但是我發(fā)現(xiàn)想寫 react 不容易。 我需要在開始寫代碼之前做很多準備工作,我需要編譯jsx文件,引入react等等,而最新的react示例,有鼓勵ES6來書...
react組件 參考:https://facebook.github.io/re... react的組件是其核心思想部分,react允許將整個ui設(shè)計分割稱為獨立的、可復(fù)用的隔離模塊,react的組件是一個抽象的類,直接使用reacy.component是沒有很大意義的,所以一般使用的方法就是定義一個 class 來繼承這個component,并且需要實現(xiàn)方法 render();就像下面一樣: ...
react組件 參考:https://facebook.github.io/re... react的組件是其核心思想部分,react允許將整個ui設(shè)計分割稱為獨立的、可復(fù)用的隔離模塊,react的組件是一個抽象的類,直接使用reacy.component是沒有很大意義的,所以一般使用的方法就是定義一個 class 來繼承這個component,并且需要實現(xiàn)方法 render();就像下面一樣: ...
摘要:插件記錄和主題建議自動閉合標(biāo)簽雙標(biāo)簽更改時自動同步代碼美化工具給括號著色使之更易識別的中文語言包顏色選擇工具吸血鬼主題主題日志支持支持包提示路徑補全語法支持語法支持支持通過同步插件插件文件圖標(biāo)插件在中調(diào)試頁面更新添加設(shè)置效果 vscode插件記錄和主題建議 Auto Close Tag + 自動閉合標(biāo)簽 Auto Rename Tag + 雙標(biāo)簽更改時自動同步 Beautify ...
摘要:在中必須調(diào)用方法,因為子類沒有自己的對象,而是繼承父類的對象,然后對其進行加工而就代表了父類的構(gòu)造函數(shù)。雖然代表了父類的構(gòu)造函數(shù),但是返回的是子類的實例,即內(nèi)部的指的是,因此在這里相當(dāng)于。要求,子類的構(gòu)造函數(shù)必須執(zhí)行一次函數(shù),否則會報錯。 1.class ES6 提供了更接近傳統(tǒng)語言的寫法,引入了 Class(類)這個概念,作為對象的模板。通過class關(guān)鍵字,可以定義類。基本上,ES...
閱讀 2575·2021-10-11 10:58
閱讀 1156·2021-09-29 09:34
閱讀 1513·2021-09-26 09:46
閱讀 3837·2021-09-22 15:31
閱讀 740·2019-08-30 15:54
閱讀 1462·2019-08-30 13:20
閱讀 1257·2019-08-30 13:13
閱讀 1491·2019-08-26 13:52