const newForm = {...form, [fieldName]: newFieldState};
和const formValid = Object.values(newForm).every(f => f.valid);
這兩行代碼怎么理解?
UserProvider.js
import React from 'react';
/*
{
name: {
defaultValue: '王子'
},
age: {
defaultValue: 0
},
gender: {
defaultValue: '男'
}
}
*/
function userProvider (fields) {
return function (Comp) {
const initialFormState = {};
for (const key in fields) {
initialFormState[key] = {
value: fields[key].defaultValue,
error: ''
};
}
/*
initialFormState = {
name: {
value: '王子',
error: ''
}
}
*/
class UserComponent extends React.Component {
constructor (props) {
super(props);
this.state = {
form: initialFormState,
formValid: false
};
console.log('初始化的狀態(tài)')
console.log(initialFormState)
}
handleValueChange (fieldName, value) {
const { form } = this.state;
// var form = this.state.form;
console.log('form');
console.log(form);
const newFieldState = {value, valid: true, error: ''};
console.log('fieldName');
console.log(fieldName);
console.log('newFieldState');
console.log(newFieldState);
const newForm = {...form, [fieldName]: newFieldState};
console.log('newForm')
console.log(newForm)
const formValid = Object.values(newForm).every(f => f.valid);
this.setState({
form: newForm,
formValid
});
}
render () {
const {form, formValid} = this.state;
return (
<Comp
{...this.props}
form={form}
onFormChange={this.handleValueChange.bind(this)}
/>
)
}
}
return UserComponent;
}
}
export default userProvider;
UserAdd.js
import React from 'react';
import UserProvider from './UserProvider';
class UserAdd extends React.Component {
handleSubmit (e) {
e.preventDefault();
const {form: {name, age, gender}, formValid} = this.props;
}
render () {
const {form: {name, age, gender}, onFormChange} = this.props;
return (
<div>
<header>
<h1>添加用戶</h1>
</header>
<main>
<form onSubmit={(e) => this.handleSubmit(e)}>
<label>用戶名:</label>
<input
type="text"
value={name.value}
onChange={(e) => onFormChange('name', e.target.value)}
/>
<br/>
<label>年齡:</label>
<input
type="number"
value={age.value || ''}
onChange={(e) => onFormChange('age', +e.target.value)}
/>
<br/>
<label>性別:</label>
<select
value={gender.value}
onChange={(e) => onFormChange('gender', e.target.value)}
>
<option value="">請(qǐng)選擇</option>
<option value="male">男</option>
<option value="female">女</option>
</select>
<br/>
<br/>
<input type="submit" value="提交"/>
</form>
</main>
</div>
)
}
}
UserAdd = UserProvider({
name: {
defaultValue: '王子'
},
age: {
defaultValue: 0
},
gender: {
defaultValue: '男'
}
})(UserAdd);
export default UserAdd;
這些都是 ES6
中 解構(gòu) 和 拓展運(yùn)算符(...) 的一些知識(shí),看我寫(xiě)的這個(gè)小栗子就知道什么作用了。
關(guān)于結(jié)構(gòu)可以去學(xué)習(xí)一下,自己谷歌搜索一下 ES6
的解構(gòu) 和 拓展運(yùn)算符,一堆教程。
擴(kuò)展運(yùn)算符( spread )是三個(gè)點(diǎn)(...)。它好比 rest 參數(shù)的逆運(yùn)算,將一個(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分隔的參數(shù)序列。
console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]
拓展運(yùn)算符(...) 用于操作數(shù)組,有兩種層面
第一個(gè)叫做 展開(kāi)運(yùn)算符(spread operator),作用是和字面意思一樣,就是把東西展開(kāi)??梢杂迷?array
和 object
上都行。
比如:
let a = [1,2,3];
let b = [0, ...a, 4]; // [0,1,2,3,4]
let obj = { a: 1, b: 2 };
let obj2 = { ...obj, c: 3 }; // { a:1, b:2, c:3 }
let obj3 = { ...obj, a: 3 }; // { a:3, b:2 }
第二個(gè),第三個(gè)叫做 剩余操作符(rest operator),是解構(gòu)的一種,意思就是把剩余的東西放到一個(gè)array里面賦值給它。一般只針對(duì)array的解構(gòu),其他的沒(méi)見(jiàn)過(guò)。。。
比如:
let a = [1,2,3];
let [b, ...c] = a;
b; // 1
c; // [2,3]
// 也可以
let a = [1,2,3];
let [b, ...[c,d,e]] = a;
b; // 1
c; // 2
d; // 3
e; // undefined
// 也可以
function test(a, ...rest){
console.log(a); // 1
console.log(rest); // [2,3]
}
test(1,2,3)
還有類似的
let array = [1, 2, 3, 4, 5];
const { x, y, ...z } = array;
// 其中z=[3, 4, 5],注意如果由于array的length不足以完成析構(gòu),則會(huì)導(dǎo)致z為[]
對(duì)象:
let obj = { name: 'zhangsan', age: 30, city: 'shenzhen' };
const {name, ...others} = obj;
console.log(name); // 'zhangsan'
console.log(others); // {age: 30, city: 'shenzhen'}
Object.keys
和 Object.values
顯而易見(jiàn)一個(gè)獲取對(duì)象的 key
值,一個(gè)獲取對(duì)象的 value
值,返回的都是數(shù)組。
關(guān)于數(shù)組的 every
用法,其實(shí)也很簡(jiǎn)單。
對(duì)數(shù)組中的每個(gè)元素都執(zhí)行一次指定的函數(shù)(callback),直到此函數(shù)返回 false,如果發(fā)現(xiàn)這個(gè)元素,every 將返回 false,如果回調(diào)函數(shù)對(duì)每個(gè)元素執(zhí)行后都返回 true ,every 將返回 true。它只對(duì)數(shù)組中的非空元素執(zhí)行指定的函數(shù),沒(méi)有賦值或者已經(jīng)刪除的元素將被忽略
//測(cè)試是否所有數(shù)組元素都大于等于10:
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true
//結(jié)果:
//[12, 5, 8, 130, 44].every(isBigEnough) 返回 : false
//[12, 54, 18, 130, 44].every(isBigEnough) 返回 : true
小伙子基礎(chǔ)要學(xué)好啊,這些都是語(yǔ)法基礎(chǔ)
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。