原本我想把整個(gè)redux-form中知識(shí)點(diǎn)與使用技巧通過這個(gè)小系列短文全面總結(jié)出來的,但是此過程中發(fā)現(xiàn)問題的確不少。但同時(shí),在參考國內(nèi)外一些相關(guān)資源的同時(shí),又發(fā)現(xiàn)了一個(gè)比redux-form更值得研究的東西。先賣個(gè)關(guān)子(可能有少數(shù)朋友已經(jīng)有所了解),稍過一些時(shí)間我會(huì)專門撰文介紹。因此,臨時(shí)把本文作為此小系列的結(jié)束篇,敬請(qǐng)有志于學(xué)習(xí)redux-form有朋友原諒(當(dāng)然,在你了解到我介紹的那個(gè)更好用的form wrapper后你更為有所體諒)。
成都創(chuàng)新互聯(lián)公司從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元北關(guān)做網(wǎng)站,已為上家服務(wù),為北關(guān)各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
redux-form官方網(wǎng)站提供了操作form的許多API,其中最重要的無外乎三個(gè):reduxForm(config:Object) 、props和
本文專注于分析
在正確使用
此屬性值可以是簡(jiǎn)單的字符串,如 userName、password,也可以是使用點(diǎn)和中括號(hào)串聯(lián)表達(dá)的代表路徑含義的復(fù)雜的字符串結(jié)構(gòu),如 contact.billing.address[2].phones[1].areaCode。
此屬性值可以是一個(gè)React組件(Component)、無狀態(tài)函數(shù)(stateless function)或者是DOM所支持的默認(rèn)的標(biāo)簽(分別是input、textarea和select)元素。
能夠傳遞給
官文原文中說法是“All other props will be passed along to the element generated by the component prop.”直譯過來,好像是“其他所有屬性會(huì)被傳遞給由component屬性生成的元素”。但是,這種理解本人感覺十分不妥,又有同學(xué)Ted Yuen的翻譯成“其他所有屬性會(huì)通過prop傳遞到元素生成器中。如 className?!备杏X也不是很恰當(dāng)。還是讓我們隨著本文最后面復(fù)雜的示例討論來確定如何理解這一句吧。
var Field = require('redux-form').Field; // ES5
import { Field } from 'redux-form'; // ES6
這種情形下 ,component屬性值可以是任何自定義的組件或者從其他第三方庫導(dǎo)入的React組件。定義組件的代碼請(qǐng)參考:
// MyCustomInput.js
import React, { Component } from 'react'
class MyCustomInput extends Component {
render() {
const { input: { value, onChange } } = this.props
return (
The current value is {value}.
)
}
}
然后在你的表單組件定義代碼中便可以這樣使用:
import MyCustomInput from './MyCustomInput'
...
這是使用
【切記】必須在render() 方法外部定義上述無狀態(tài)函數(shù);否則,它會(huì)隨著每次渲染都會(huì)被重新創(chuàng)建,從而由于組件的 prop發(fā)生了變化而使得系統(tǒng)強(qiáng)制
// outside your render() method
const renderField = (field) => (
{field.meta.touched && field.meta.error &&
{field.meta.error}}
)
// inside your render() method
這種使用情況比較簡(jiǎn)單,比如創(chuàng)建一個(gè)文字輸入框組件,你只需要使用如下方式:
<Field component="input" type="text"/>
易見,這種方式是把傳統(tǒng)DOM元素用
說明:本例中的代碼大部分來自于官方網(wǎng)站提供的redux-form-field-level-validation.js這個(gè)文件,也就是有關(guān)于在一個(gè)redux-form表單中進(jìn)行按字段校驗(yàn)的情況。但是,有幾句代碼作了修改,有興趣的同學(xué)請(qǐng)認(rèn)真觀察分析(為了便于參考,我把這個(gè)文件的修改版本的完整代碼列舉如下):
import React from 'react'
import { Field, reduxForm } from 'redux-form'
const required = value => value ? undefined : 'Required'
const maxLength = max => value =>
value && value.length > max ? `Must be ${max} characters or less` : undefined
const maxLength25 = maxLength(15)
const number = value => value && isNaN(Number(value)) ? 'Must be a number' : undefined
const minValue = min => value =>
value && value < min ? `Must be at least ${min}` : undefined
const minValue18 = minValue(18)
const email = value =>
value && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(value) ?
'Invalid email address' : undefined
const tooOld = value =>
value && value > 65 ? 'You might be too old for this' : undefined
const aol = value =>
value && /.+@aol\.com/.test(value) ?
'Really? You still use AOL for your email?' : undefined
const renderField = ({ input, label, type, custom001,meta: { touched, error, warning } }) => (
input
{JSON.stringify(custom001)}
{touched && ((error && {error}) || (warning && {warning}))}
)
const selects = [
{
text:'-- Select --',
value:'-1'
},
{
text:'Red',
value:'ff0000'
},
{
text:'Green',
value:'00ff00'
},
{
text:'Blue',
value:'0000ff'
}
]
const selectField = ({
input,
label,
selects,
meta: { touched, error, warning }
}) => (
{label}
{touched &&
((error && {error}) ||
(warning && {warning}))}
)
const FieldLevelValidationForm = (props) => {
const { handleSubmit, pristine, reset, submitting } = props
return (
)
}
export default reduxForm({
form: 'fieldLevelValidation' // a unique identifier for this form
})(FieldLevelValidationForm)
上述代碼中請(qǐng)注意如下幾點(diǎn):
(1)
(2)因?yàn)樯厦娲a的核心是討論逐字段校驗(yàn)技術(shù)的,所以,仍然需要關(guān)注
(3)再需要關(guān)注的是
{ input, label, type, custom001,meta: { touched, error, warning } }
有關(guān)input和meta,官方網(wǎng)站已經(jīng)提供了細(xì)致的說明,label和type對(duì)應(yīng)于原始DOM標(biāo)記的有關(guān)屬性,而custom001則是上面代碼中定義
在redux-form中,
1.https://redux-form.com/7.4.2/docs/api/field.md/
2.https://github.com/tedyuen/react-redux-form-v6-example#Field