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('初始化的状态')
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="">请选择</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
中 解构 和 拓展运算符(...) 的一些知识,看我写的这个小栗子就知道什么作用了。关于结构可以去学习一下,自己谷歌搜索一下
ES6
的解构 和 拓展运算符,一堆教程。扩展运算符( spread )是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。
拓展运算符(...) 用于操作数组,有两种层面
第一个叫做 展开运算符(spread operator),作用是和字面意思一样,就是把东西展开。可以用在
array
和object
上都行。比如:
第二个,第三个叫做 剩余操作符(rest operator),是解构的一种,意思就是把剩余的东西放到一个array里面赋值给它。一般只针对array的解构,其他的没见过。。。
比如:
还有类似的
Object.keys
和Object.values
显而易见一个获取对象的key
值,一个获取对象的value
值,返回的都是数组。关于数组的
every
用法,其实也很简单。小伙子基础要学好啊,这些都是语法基础