react基础篇六
创建 Refs
使用 React.createRef()
创建 refs,通过 ref
属性来获得 React 元素。当构造组件时,refs 通常被赋值给实例的一个属性,这样你可以在组件中任意一处使用它们.
class MyComponent extends React.Component { constructor(props) { super(props); this.myRef = React.createRef(); } render() { return <div ref={this.myRef} />; } }
访问 Refs
当一个 ref 属性被传递给一个 render
函数中的元素时,可以使用 ref 中的 current
属性对节点的引用进行访问。
const node = this.myRef.current;
ref的值取决于节点的类型:
- 当
ref
属性被用于一个普通的 HTML 元素时,React.createRef()
将接收底层 DOM 元素作为它的current
属性以创建ref
。 - 当
ref
属性被用于一个自定义类组件时,ref
对象将接收该组件已挂载的实例作为它的current
。 - 你不能在函数式组件上使用
ref
属性,因为它们没有实例。
下面的例子说明了这些差异。
使用回调函数进行创建refs:
<input type="text" ref={(input) => this.input = input} />
想要实现代码而不突变原始对象,我们可以使用Object.assign方法:
function updateColorMap(colormap) { return Object.assign({}, colormap, {right: 'blue'}); }
updateColorMap
现在会返回一个新对象,而不会突变之前的旧对象。Object.assign
在ES6中,需要polyfill
支持。
有一个JavaScript提议来添加对象展开属性以使其更容易地更新对象并且不会突变对象:
function updateColorMap(colormap) { return {...colormap, right: 'blue'}; }
如果使用Create React App
,默认情况下 Object.assign
和对象展开语法都可以使用。
Fragments(template)
React 中一个常见模式是为一个组件返回多个元素。Fragments 可以让你聚合一个子元素列表,并且不在DOM中增加额外节点。
Fragments 看起来像空的 JSX 标签:
render() { return ( <> <ChildA /> <ChildB /> <ChildC /> </> ); }
清晰的形式
另一种使用片段的方式是使用 React.Fragment
组件,React.Fragment
组件可以在 React 对象上使用。 这可能是必要的,如果你的工具还不支持 JSX 片段。 注意在 React 中, <></>
是 <React.Fragment/>
的语法糖。
class Columns extends React.Component { render() { return ( <React.Fragment> <td>Hello</td> <td>World</td> </React.Fragment> ); } }
带 key 的 Fragments
<></>
语法不能接受键值或属性。
如果你需要一个带 key 的片段,你可以直接使用 <React.Fragment />
。 一个使用场景是映射一个集合为一个片段数组 — 例如:创建一个描述列表:
function Glossary(props) { return ( <dl> {props.items.map(item => ( // 没有`key`,将会触发一个key警告 <React.Fragment key={item.id}> <dt>{item.term}</dt> <dd>{item.description}</dd> </React.Fragment> ))} </dl> ); }
key
是唯一可以传递给 Fragment
的属性。在将来,我们可能增加额外的属性支持,比如事件处理。