国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

翻譯 | 玩轉(zhuǎn) React 表單 —— 受控組件詳解

big_cat / 3300人閱讀

摘要:受控輸入框只會(huì)顯示通過傳入的數(shù)據(jù)。例如,數(shù)組中的元素將會(huì)渲染三個(gè)單選框或復(fù)選框。屬性接收一個(gè)布爾值,用來表示組件是否應(yīng)該被渲染成選中狀態(tài)。

原文地址:React.js Forms: Controlled Components

原文作者:Loren Stewart

譯者:小 B0Y

校對(duì)者:珂珂君

本文涵蓋以下受控組件:

文本輸入框

數(shù)字輸入框

單選框

復(fù)選框

文本域

下拉選擇框

同時(shí)也包含:

表單數(shù)據(jù)的清除和重置

表單數(shù)據(jù)的提交

表單校驗(yàn)

點(diǎn)擊這里直接查看示例代碼。
查看示例。
請(qǐng)?jiān)谶\(yùn)行示例時(shí)打開瀏覽器的控制臺(tái)。

介紹

在學(xué)習(xí) React.js 時(shí)我遇到了一個(gè)問題,那就是很難找到受控組件的真實(shí)示例。受控文本輸入框的例子倒是很豐富,但復(fù)選框、單選框、下拉選擇框的例子卻不盡人意。

本文列舉了真實(shí)的受控表單組件示例,要是我在學(xué)習(xí) React 的時(shí)候早點(diǎn)發(fā)現(xiàn)這些示例就好了。除了日期和時(shí)間輸入框需要另開篇幅詳細(xì)討論,文中列舉了所有的表單元素。

有時(shí)候,為了減少開發(fā)時(shí)間,有時(shí)候人們很容易為了一些東西(譬如表單元素)引入一個(gè)庫。而對(duì)于表單,我發(fā)現(xiàn)當(dāng)需要添加自定義行為或表單校驗(yàn)時(shí),使用庫會(huì)讓事情變得更復(fù)雜。不過一旦掌握合適的 React 模式,你會(huì)發(fā)現(xiàn)構(gòu)建表單組件并非難事,并且有些東西完全可以自己動(dòng)手,豐衣足食。請(qǐng)把本文的示例代碼當(dāng)作你創(chuàng)建表單組件的起點(diǎn)或靈感之源。

除了提供多帶帶的組件代碼,我還將這些組件放進(jìn)表單中,方便你理解子組件如何更新父組件 state ,以及接下來父組件如何通過 props(單向數(shù)據(jù)流)更新子組件。

注意:本表單示例由很贊的 create-react-app 構(gòu)建配置生成,如果你還沒有安裝該構(gòu)建配置,我強(qiáng)烈推薦你安裝一下(npm install -g create-react-app)。目前這是搭建 React 應(yīng)用最簡(jiǎn)單的方式。

什么是受控組件?

受控組件有兩個(gè)特點(diǎn):

受控組件提供方法,讓我們?cè)诿看?onChange 事件發(fā)生時(shí)控制它們的數(shù)據(jù),而不是一次性地獲取表單數(shù)據(jù)(例如用戶點(diǎn)提交按鈕時(shí))。“被控制“ 的表單數(shù)據(jù)保存在 state 中(在本文示例中,是父組件或容器組件的 state)。
(譯注:這里作者的意思是通過受控組件, 可以跟蹤用戶操作表單時(shí)的數(shù)據(jù),從而更新容器組件的 state ,再單向渲染表單元素 UI。如果不使用受控組件,在用戶實(shí)時(shí)操作表單時(shí),比如在輸入框輸入文本時(shí),不會(huì)同步到容器組件的 state,雖然能同步輸入框本身的 value,但與容器組件的 state 無關(guān),因此容器組件只能在某一時(shí)間,比如提表單時(shí)一次性地拿到(通過 refs 或者選擇器)表單數(shù)據(jù),而難以跟蹤)

受控組件的展示數(shù)據(jù)是其父組件通過 props 傳遞下來的。

這個(gè)單向循環(huán) —— (數(shù)據(jù))從(1)子組件輸入到(2)父組件的 state,接著(3)通過 props 回到子組件,就是 React.js 應(yīng)用架構(gòu)中單向數(shù)據(jù)流的含義。

表單結(jié)構(gòu)

我們的頂級(jí)組件叫做 App,這是它的代碼:

import React, { Component } from "react";  
import "../node_modules/spectre.css/dist/spectre.min.css";  
import "./styles.css";  
import FormContainer from "./containers/FormContainer";

class App extends Component {  
  render() {
    return (
      

React.js Controlled Form Components

); } } export default App;

App 只負(fù)責(zé)渲染 index.html 頁面。整個(gè) App 組件最有趣的部分是 13 行,FormContainer 組件。

插曲: 容器(智能)組件 VS 普通(木偶)組件

是時(shí)候提及一下容器(智能)組件和普通(木偶)組件了。容器組件包含業(yè)務(wù)邏輯,它會(huì)發(fā)起數(shù)據(jù)請(qǐng)求或進(jìn)行其他業(yè)務(wù)操作。普通組件則從它的父(容器)組件接收數(shù)據(jù)。木偶組件有可能觸發(fā)更新 state (譯注:容器組件的 state)這類邏輯行為,但它僅通過從父(容器)組件傳入的方法來達(dá)到該目的。

注意: 雖然在我們的表單應(yīng)用里父組件就是容器組件,但我要強(qiáng)調(diào),并非所有的父組件都是容器組件。木偶組件嵌套木偶組件也是可以的。

回到應(yīng)用結(jié)構(gòu)

FormContainer 組件包含了表單元素組件,它在生命周期鉤子方法 componentDidMount 里請(qǐng)求數(shù)據(jù),此外還包含更新表單應(yīng)用 state 的邏輯行為。在下面的預(yù)覽代碼里,我移除了表單元素的 props 和 change 事件處理方法,這樣看起來更簡(jiǎn)潔清晰(拉到文章底部,可以看到完整代碼)。

import React, {Component} from "react";  
import CheckboxOrRadioGroup from "../components/CheckboxOrRadioGroup";  
import SingleInput from "../components/SingleInput";  
import TextArea from "../components/TextArea";  
import Select from "../components/Select";

class FormContainer extends Component {  
  constructor(props) {
    super(props);
    this.handleFormSubmit = this.handleFormSubmit.bind(this);
    this.handleClearForm = this.handleClearForm.bind(this);
  }
  componentDidMount() {
    fetch("./fake_db.json")
      .then(res => res.json())
      .then(data => {
        this.setState({
          ownerName: data.ownerName,
          petSelections: data.petSelections,
          selectedPets: data.selectedPets,
          ageOptions: data.ageOptions,
          ownerAgeRangeSelection: data.ownerAgeRangeSelection,
          siblingOptions: data.siblingOptions,
          siblingSelection: data.siblingSelection,
          currentPetCount: data.currentPetCount,
          description: data.description
        });
    });
  }
  handleFormSubmit() {
    // 提交邏輯寫在這
  }
  handleClearForm() {
    // 清除表單邏輯寫在這
  }
  render() {
    return (
      
Pet Adoption Form
{/* Full name text input */}