mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
617 lines
29 KiB
HTML
617 lines
29 KiB
HTML
<!DOCTYPE html>
|
||
<!--[if IE]><![endif]-->
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||
<title>表单组件 | React</title>
|
||
<meta name="viewport" content="width=device-width">
|
||
<meta property="og:title" content="表单组件 | React">
|
||
<meta property="og:type" content="website">
|
||
<meta property="og:url" content="https://facebook.github.io/react/docs/forms-zh-CN.html">
|
||
<meta property="og:image" content="https://facebook.github.io/react/img/logo_og.png">
|
||
<meta property="og:description" content="A JavaScript library for building user interfaces">
|
||
<meta property="fb:app_id" content="623268441017527">
|
||
|
||
<link rel="shortcut icon" href="/react/favicon.ico">
|
||
<link rel="alternate" type="application/rss+xml" title="React" href="https://facebook.github.io/react/feed.xml">
|
||
|
||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css" />
|
||
<link rel="stylesheet" href="/react/css/syntax.css">
|
||
<link rel="stylesheet" href="/react/css/codemirror.css">
|
||
<link rel="stylesheet" href="/react/css/react.css">
|
||
|
||
<script src="//use.typekit.net/vqa1hcx.js"></script>
|
||
<script>try{Typekit.load();}catch(e){}</script>
|
||
|
||
<!--[if lte IE 8]>
|
||
<script src="/react/js/html5shiv.min.js"></script>
|
||
<script src="/react/js/es5-shim.min.js"></script>
|
||
<script src="/react/js/es5-sham.min.js"></script>
|
||
<![endif]-->
|
||
<script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script>
|
||
<script src="/react/js/codemirror.js"></script>
|
||
<script src="/react/js/javascript.js"></script>
|
||
<script src="/react/js/xml.js"></script>
|
||
<script src="/react/js/jsx.js"></script>
|
||
<script src="/react/js/react.js"></script>
|
||
<script src="/react/js/react-dom.js"></script>
|
||
<script src="/react/js/babel.min.js"></script>
|
||
<script src="/react/js/live_editor.js"></script>
|
||
</head>
|
||
<body>
|
||
|
||
<div class="container">
|
||
|
||
<div class="nav-main">
|
||
<div class="wrap">
|
||
<a class="nav-home" href="/react/index.html">
|
||
<img class="nav-logo" src="/react/img/logo.svg" width="36" height="36">
|
||
React
|
||
</a>
|
||
<ul class="nav-site nav-site-internal">
|
||
<li><a href="/react/docs/getting-started.html" class="active">Docs</a></li>
|
||
<li><a href="/react/support.html">Support</a></li>
|
||
<li><a href="/react/downloads.html">Download</a></li>
|
||
<li><a href="/react/blog/">Blog</a></li>
|
||
<li>
|
||
<input id="algolia-doc-search" type="text" placeholder="Search docs..." />
|
||
</li>
|
||
</ul>
|
||
|
||
<ul class="nav-site nav-site-external">
|
||
<li><a href="https://github.com/facebook/react">GitHub</a></li>
|
||
<li><a href="https://facebook.github.io/react-native/">React Native</a></li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<section class="content wrap documentationContent">
|
||
<div class="nav-docs">
|
||
<!-- Docs Nav -->
|
||
|
||
<div class="nav-docs-section">
|
||
<h3>Quick Start</h3>
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/docs/getting-started.html">Getting Started</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/tutorial.html">Tutorial</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/thinking-in-react.html">Thinking in React</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="nav-docs-section">
|
||
<h3>Community Resources</h3>
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/docs/conferences.html">Conferences</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/videos.html">Videos</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://github.com/facebook/react/wiki/Complementary-Tools" class="external">Complementary Tools</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="https://github.com/facebook/react/wiki/Examples" class="external">Examples</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="nav-docs-section">
|
||
<h3>Guides</h3>
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/docs/why-react.html">Why React?</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/displaying-data.html">Displaying Data</a>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/docs/jsx-in-depth.html">JSX in Depth</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/jsx-spread.html">JSX Spread Attributes</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/jsx-gotchas.html">JSX Gotchas</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/interactivity-and-dynamic-uis.html">Interactivity and Dynamic UIs</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/multiple-components.html">Multiple Components</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/reusable-components.html">Reusable Components</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/transferring-props.html">Transferring Props</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/forms.html">Forms</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/working-with-the-browser.html">Working With the Browser</a>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/docs/more-about-refs.html">Refs to Components</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/tooling-integration.html">Tooling Integration</a>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/docs/language-tooling.html">Language Tooling</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/package-management.html">Package Management</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/environments.html">Server-side Environments</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/addons.html">Add-Ons</a>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/docs/animation.html">Animation</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/two-way-binding-helpers.html">Two-Way Binding Helpers</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/test-utils.html">Test Utilities</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/clone-with-props.html">Cloning Elements</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/create-fragment.html">Keyed Fragments</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/update.html">Immutability Helpers</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/pure-render-mixin.html">PureRenderMixin</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/perf.html">Performance Tools</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/shallow-compare.html">Shallow Compare</a>
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/advanced-performance.html">Advanced Performance</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/context.html">Context</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="nav-docs-section">
|
||
<h3>Reference</h3>
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/docs/top-level-api.html">Top-Level API</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/component-api.html">Component API</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/component-specs.html">Component Specs and Lifecycle</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/tags-and-attributes.html">Supported Tags and Attributes</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/events.html">Event System</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/dom-differences.html">DOM Differences</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/special-non-dom-attributes.html">Special Non-DOM Attributes</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/reconciliation.html">Reconciliation</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/webcomponents.html">Web Components</a>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/docs/glossary.html">React (Virtual) DOM Terminology</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
|
||
<!-- Tips Nav -->
|
||
|
||
<div class="nav-docs-section">
|
||
<h3>Tips</h3>
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/tips/introduction.html">Introduction</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/inline-styles.html">Inline Styles</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/if-else-in-JSX.html">If-Else in JSX</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/self-closing-tag.html">Self-Closing Tag</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/maximum-number-of-jsx-root-nodes.html">Maximum Number of JSX Root Nodes</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/style-props-value-px.html">Shorthand for Specifying Pixel Values in style props</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/children-props-type.html">Type of the Children props</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/controlled-input-null-value.html">Value of null for Controlled Input</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/componentWillReceiveProps-not-triggered-after-mounting.html">componentWillReceiveProps Not Triggered After Mounting</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/props-in-getInitialState-as-anti-pattern.html">Props in getInitialState Is an Anti-Pattern</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/dom-event-listeners.html">DOM Event Listeners in a Component</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/initial-ajax.html">Load Initial Data via AJAX</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/false-in-jsx.html">False in JSX</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/communicate-between-components.html">Communicate Between Components</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/expose-component-functions.html">Expose Component Functions</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/children-undefined.html">this.props.children undefined</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/use-react-with-other-libraries.html">Use React with Other Libraries</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/tips/dangerously-set-inner-html.html">Dangerously Set innerHTML</a>
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
|
||
<!-- Contributing Nav -->
|
||
|
||
<div class="nav-docs-section">
|
||
<h3>Contributing</h3>
|
||
<ul>
|
||
|
||
<li>
|
||
<a href="/react/contributing/how-to-contribute.html">How to Contribute</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/contributing/codebase-overview.html">Codebase Overview</a>
|
||
</li>
|
||
|
||
<li>
|
||
<a href="/react/contributing/design-principles.html">Design Principles</a>
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
<div class="inner-content">
|
||
<a class="edit-page-link" href="https://github.com/facebook/react/tree/master/docs/docs/07-forms.zh-CN.md" target="_blank">Edit on GitHub</a>
|
||
<h1>
|
||
表单组件
|
||
</h1>
|
||
<div class="subHeader"></div>
|
||
|
||
<p>诸如 <code><input></code>、<code><textarea></code>、<code><option></code> 这样的表单组件不同于其他原生组件,因为他们可以通过用户交互发生变化。这些组件提供的界面使响应用户交互的表单数据处理更加容易。</p>
|
||
|
||
<p>关于 <code><form></code> 事件详情请查看 <a href="/react/docs/events-zh-CN.html#%E8%A1%A8%E5%8D%95%E4%BA%8B%E4%BB%B6">表单事件</a>。</p>
|
||
<h2><a class="anchor" name="交互属性"></a>交互属性 <a class="hash-link" href="#交互属性">#</a></h2>
|
||
<p>表单组件支持几个受用户交互影响的属性:</p>
|
||
|
||
<ul>
|
||
<li><code>value</code>,用于 <code><input></code>、<code><textarea></code> 组件。</li>
|
||
<li><code>checked</code>,用于类型为 <code>checkbox</code> 或者 <code>radio</code> 的 <code><input></code> 组件。</li>
|
||
<li><code>selected</code>,用于 <code><option></code> 组件。</li>
|
||
</ul>
|
||
|
||
<p>在 HTML 中,<code><textarea></code> 的值通过子节点设置;在 React 中则应该使用 <code>value</code> 代替。</p>
|
||
|
||
<p>表单组件可以通过 <code>onChange</code> 回调函数来监听组件变化。当用户做出以下交互时,<code>onChange</code> 执行并通过浏览器做出响应:</p>
|
||
|
||
<ul>
|
||
<li><code><input></code> 或 <code><textarea></code> 的 <code>value</code> 发生变化时。</li>
|
||
<li><code><input></code> 的 <code>checked</code> 状态改变时。</li>
|
||
<li><code><option></code> 的 <code>selected</code> 状态改变时。</li>
|
||
</ul>
|
||
|
||
<p>和所有 DOM 事件一样,所有的 HTML 原生组件都支持 <code>onChange</code> 属性,而且可以用来监听冒泡的 <code>change</code> 事件。</p>
|
||
|
||
<blockquote>
|
||
<p>注意:</p>
|
||
|
||
<p>对于 <code><input></code> and <code><textarea></code>, <code>onChange</code> 取代 — 一般应该用来替代 — DOM内建的 <a href="https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/oninput"><code>oninput</code></a> 事件处理。</p>
|
||
</blockquote>
|
||
<h2><a class="anchor" name="受控组件"></a>受控组件 <a class="hash-link" href="#受控组件">#</a></h2>
|
||
<p>一个<em>受控</em>的 <code><input></code> 有一个 <code>value</code> prop。渲染一个受控 <code><input></code> 会反映 <code>value</code> prop 的值。</p>
|
||
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
<span class="k">return</span> <span class="o"><</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">"text"</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"Hello!"</span> <span class="o">/></span><span class="p">;</span>
|
||
<span class="p">}</span>
|
||
</code></pre></div>
|
||
<p>用户输入在被渲染的元素里将没有作用,因为 React 已经声明值为 <code>Hello!</code>。要更新 value 来响应用户输入,你可以使用 <code>onChange</code> 事件:</p>
|
||
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">getInitialState</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
<span class="k">return</span> <span class="p">{</span><span class="nx">value</span><span class="o">:</span> <span class="s1">'Hello!'</span><span class="p">};</span>
|
||
<span class="p">},</span>
|
||
<span class="nx">handleChange</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
|
||
<span class="k">this</span><span class="p">.</span><span class="nx">setState</span><span class="p">({</span><span class="nx">value</span><span class="o">:</span> <span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">});</span>
|
||
<span class="p">},</span>
|
||
<span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
<span class="k">return</span> <span class="p">(</span>
|
||
<span class="o"><</span><span class="nx">input</span>
|
||
<span class="nx">type</span><span class="o">=</span><span class="s2">"text"</span>
|
||
<span class="nx">value</span><span class="o">=</span><span class="p">{</span><span class="k">this</span><span class="p">.</span><span class="nx">state</span><span class="p">.</span><span class="nx">value</span><span class="p">}</span>
|
||
<span class="nx">onChange</span><span class="o">=</span><span class="p">{</span><span class="k">this</span><span class="p">.</span><span class="nx">handleChange</span><span class="p">}</span>
|
||
<span class="o">/></span>
|
||
<span class="p">);</span>
|
||
<span class="p">}</span>
|
||
</code></pre></div>
|
||
<p>在这个例子中,我们接受用户提供的值并更新 <code><input></code> 组件的 <code>value</code> prop。这个模式使实现响应或者验证用户输入的界面更容易。例如:</p>
|
||
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">handleChange</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
|
||
<span class="k">this</span><span class="p">.</span><span class="nx">setState</span><span class="p">({</span><span class="nx">value</span><span class="o">:</span> <span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">140</span><span class="p">)});</span>
|
||
<span class="p">}</span>
|
||
</code></pre></div>
|
||
<p>上面的代码接受用户输入,并截取前 140 个字符。</p>
|
||
|
||
<p>受控组件不维持一个自己的内部状态;它单纯的基于 props 渲染。</p>
|
||
<h3><a class="anchor" name="复选框与单选按钮的潜在问题"></a>复选框与单选按钮的潜在问题 <a class="hash-link" href="#复选框与单选按钮的潜在问题">#</a></h3>
|
||
<p>当心,在力图标准化复选框与单选按钮的变换处理中,React使用 <code>click</code> 事件代替 <code>change</code> 事件。在大多数情况下它们表现的如同预期,除了在<code>change</code> handler中调用<code>preventDefault</code> 。<code>preventDefault</code> 阻止了浏览器视觉上更新输入,即使<code>checked</code>被触发。变通的方式是要么移除<code>preventDefault</code>的调用,要么把<code>checked</code> 的触发放在一个<code>setTimeout</code>里。</p>
|
||
<h2><a class="anchor" name="不受控组件"></a>不受控组件 <a class="hash-link" href="#不受控组件">#</a></h2>
|
||
<p>一个没有 <code>value</code> 属性的 <code><input></code> 是一个不<em>受控</em>组件:</p>
|
||
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
<span class="k">return</span> <span class="o"><</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">"text"</span> <span class="o">/></span><span class="p">;</span>
|
||
<span class="p">}</span>
|
||
</code></pre></div>
|
||
<p>上面的代码将渲染出一个空值的输入框,用户输入将立即反应到元素上。和受控元素一样,使用 <code>onChange</code> 事件可以监听值的变化。</p>
|
||
|
||
<p><em>不受控</em>组件维持它自己的内部状态。</p>
|
||
<h3><a class="anchor" name="默认值"></a>默认值 <a class="hash-link" href="#默认值">#</a></h3>
|
||
<p>如果想给组件设置一个非空的初始值,可以使用 <code>defaultValue</code> 属性。例如:</p>
|
||
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
<span class="k">return</span> <span class="o"><</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">"text"</span> <span class="nx">defaultValue</span><span class="o">=</span><span class="s2">"Hello!"</span> <span class="o">/></span><span class="p">;</span>
|
||
<span class="p">}</span>
|
||
</code></pre></div>
|
||
<p>这个例子会像上面的 <strong>受控组件</strong> 例子一样运行。</p>
|
||
|
||
<p>同样的, <code><input type="checkbox"></code> 和 <code><input type="radio"></code> 支持 <code>defaultChecked</code> 、 <code><select></code> 支持 <code>defaultValue</code>.</p>
|
||
|
||
<blockquote>
|
||
<p>注意:</p>
|
||
|
||
<p><code>defaultValue</code> 和 <code>defaultChecked</code> props 只能在内部渲染时被使用。 如果你需要在随后的渲染更新值, 你需要使用 <a href="#%E5%8F%97%E6%8E%A7%E7%BB%84%E4%BB%B6">受控组件</a>.</p>
|
||
</blockquote>
|
||
<h2><a class="anchor" name="高级主题"></a>高级主题 <a class="hash-link" href="#高级主题">#</a></h2><h3><a class="anchor" name="为什么使用受控组件"></a>为什么使用受控组件? <a class="hash-link" href="#为什么使用受控组件">#</a></h3>
|
||
<p>在 React 中使用诸如 <code><input></code> 的表单组件时,遇到了一个在传统 HTML 中没有的挑战。比如下面的代码:</p>
|
||
<div class="highlight"><pre><code class="language-html" data-lang="html"> <span class="nt"><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"title"</span> <span class="na">value=</span><span class="s">"Untitled"</span> <span class="nt">/></span>
|
||
</code></pre></div>
|
||
<p>它渲染一个<em>初始值</em>为 <code>Untitled</code> 的输入框。当用户改变输入框的值时,节点的 <code>value</code> 属性( <em>property</em>)将随之变化,但是 <code>node.getAttribute('value')</code> 还是会返回初始设置的值 <code>Untitled</code>.</p>
|
||
|
||
<p>与 HTML 不同,React 组件必须在任何时间点表现视图的状态,而不仅仅是在初始化时。比如在 React 中:</p>
|
||
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="nx">render</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
||
<span class="k">return</span> <span class="o"><</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">"text"</span> <span class="nx">name</span><span class="o">=</span><span class="s2">"title"</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"Untitled"</span> <span class="o">/></span><span class="p">;</span>
|
||
<span class="p">}</span>
|
||
</code></pre></div>
|
||
<p>由于这个方法描述了在任意时间点上的视图,那么文本输入框的值就应该<em>始终</em>为 <code>Untitled</code>。</p>
|
||
<h3><a class="anchor" name="为什么-lttextareagt-使用-value-属性"></a>为什么 <code><textarea></code> 使用 <code>value</code> 属性? <a class="hash-link" href="#为什么-lttextareagt-使用-value-属性">#</a></h3>
|
||
<p>在 HTML 中, <code><textarea></code> 的值通常使用子节点设置:</p>
|
||
<div class="highlight"><pre><code class="language-html" data-lang="html"> <span class="c"><!-- 反例:在 React 中不要这样使用! --></span>
|
||
<span class="nt"><textarea</span> <span class="na">name=</span><span class="s">"description"</span><span class="nt">></span>This is the description.<span class="nt"></textarea></span>
|
||
</code></pre></div>
|
||
<p>对 HTML 而言,让开发者设置多行的值很容易。但是,由于 React 是 JavaScript,没有字符串限制,可以使用 <code>\n</code> 实现换行。简言之,React 已经有 <code>value</code>、<code>defaultValue</code> 属性,<code><textarea></code> 组件的子节点扮演什么角色就有点模棱两可了。基于此, 设置 <code><textarea></code> 值时不应该使用子节点:</p>
|
||
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="o"><</span><span class="nx">textarea</span> <span class="nx">name</span><span class="o">=</span><span class="s2">"description"</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"This is a description."</span> <span class="o">/></span>
|
||
</code></pre></div>
|
||
<p>如果 <em>非要</em> 使用子节点,效果和使用 <code>defaultValue</code> 一样。</p>
|
||
<h3><a class="anchor" name="为什么-ltselectgt-使用-value-属性"></a>为什么 <code><select></code> 使用 <code>value</code> 属性 <a class="hash-link" href="#为什么-ltselectgt-使用-value-属性">#</a></h3>
|
||
<p>HTML 中 <code><select></code> 通常使用 <code><option></code> 的 <code>selected</code> 属性设置选中状态;React 为了更方便地控制组件,采用以下方式代替:</p>
|
||
<div class="highlight"><pre><code class="language-javascript" data-lang="javascript"> <span class="o"><</span><span class="nx">select</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"B"</span><span class="o">></span>
|
||
<span class="o"><</span><span class="nx">option</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"A"</span><span class="o">></span><span class="nx">Apple</span><span class="o"><</span><span class="err">/option></span>
|
||
<span class="o"><</span><span class="nx">option</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"B"</span><span class="o">></span><span class="nx">Banana</span><span class="o"><</span><span class="err">/option></span>
|
||
<span class="o"><</span><span class="nx">option</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"C"</span><span class="o">></span><span class="nx">Cranberry</span><span class="o"><</span><span class="err">/option></span>
|
||
<span class="o"><</span><span class="err">/select></span>
|
||
</code></pre></div>
|
||
<p>如果是不受控组件,则使用 <code>defaultValue</code>。</p>
|
||
|
||
<blockquote>
|
||
<p>注意:</p>
|
||
|
||
<p>给 <code>value</code> 属性传递一个数组,可以选中多个选项:<code><select multiple={true} value={['B', 'C']}></code>。</p>
|
||
</blockquote>
|
||
|
||
|
||
<div class="docs-prevnext">
|
||
|
||
<a class="docs-prev" href="/react/docs/transferring-props-zh-CN.html">← Prev</a>
|
||
|
||
|
||
<a class="docs-next" href="/react/docs/working-with-the-browser-zh-CN.html">Next →</a>
|
||
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
|
||
<footer class="wrap">
|
||
<div class="left">
|
||
A Facebook & Instagram collaboration.<br>
|
||
<a href="/react/acknowledgements.html">Acknowledgements</a>
|
||
</div>
|
||
<div class="right">
|
||
© 2013–2016 Facebook Inc.<br>
|
||
Documentation licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.
|
||
</div>
|
||
</footer>
|
||
</div>
|
||
<div id="fb-root"></div>
|
||
|
||
<script>
|
||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||
ga('create', 'UA-41298772-1', 'facebook.github.io');
|
||
ga('send', 'pageview');
|
||
|
||
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="https://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");
|
||
|
||
(function(d, s, id) {
|
||
var js, fjs = d.getElementsByTagName(s)[0];
|
||
if (d.getElementById(id)) return;
|
||
js = d.createElement(s); js.id = id;
|
||
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.6&appId=623268441017527";
|
||
fjs.parentNode.insertBefore(js, fjs);
|
||
}(document, 'script', 'facebook-jssdk'));
|
||
|
||
docsearch({
|
||
apiKey: '36221914cce388c46d0420343e0bb32e',
|
||
indexName: 'react',
|
||
inputSelector: '#algolia-doc-search'
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|