React 组件
React 组件一个 组件有两个核心概念:
一个组件就是通过这两个属性的值在
props
state
一旦状态(数据)更改,组件就会自动调用 划分状态数据一条原则:让组件尽可能地少状态。 这样组件逻辑就越容易维护。
当更改这个状态(数据)需要更新组件
无状态组件你也可以用纯粹的函数来定义 const HelloMessage = (props) => <div>Hello {props.name}</div>; render(<HelloMessage name="Jim"/>,app); 因为无状态组件 组件生命周期一般来说,一个组件类由 getInitialState 初始化 如果是使用 class Counter extends Component { constructor(props) { super(props); this.state = {count: props.initialCount}; } render() { } } getDefaultProps只在组件 因为这个方法在实例初始化之前调用,所以在这个方法里面不能依赖 在组件装载之后,这个方法缓存的结果会用来保证访问 如果是使用 Counter.defaultProps = {initialCount: 0}; render 组装生成这个组件的 生命周期函数装载组件触发componentWillMount 只会在装载之前调用一次,在 componentDidMount 只会在装载完成之后调用一次,在 更新组件触发这些方法不会在首次
卸载组件触发
事件处理可以看到 注意要显式调用 “合成事件”和“原生事件”
“合成事件”还提供了额外的好处: 事件委托 “合成事件”会以 什么是“原生事件”? 比如你在 使用原生事件的时候注意在 所有通过 Tips 如果混用“合成事件”和“原生事件”,比如一种常见的场景是用原生事件在 “合成事件” 的 handleClick(e) { promise.then(() => doSomethingWith(e)); } 参数传递给事件处理函数传递额外参数的方式: render: function() { return <p onClick={this.handleClick.bind(this,'extra param')}>; },handleClick: function(param,event) { // handle click } DOM 操作大部分情况下你不需要通过查询 首先我们要了解 它会返回 // A ReactElement const myComponent = <MyComponent /> // render const myComponentInstance = ReactDOM.render(myComponent,mountNode); myComponentInstance.doSomething(); findDOMNode() 当组件加载到页面上之后( import { findDOMNode } from 'react-dom'; // Inside Component class componentDidMound() { const el = findDOMNode(this); }
Refs 另外一种方式就是通过在要引用的 比如有一种情况是必须 class App extends Component { constructor() { return { userInput: '' }; } handleChange(e) { this.setState({ userInput: e.target.value }); } clearAndFocusInput() { this.setState({ userInput: '' },() => { this.refs.theInput.focus(); }); } render() { return ( <div> <div onClick={this.clearAndFocusInput.bind(this)}> Click to Focus and Reset </div> <input ref="theInput" value={this.state.userInput} onChange={this.handleChange.bind(this)} /> </div> ); } } 如果 因为无状态组件没有实例,所以 总结
注意事项
组合组件使用组件的目的就是通过构建模块化的组件,相互组合组件最后组装成一个复杂的应用。 在 循环插入子元素如果组件中包含通过循环插入的子元素,为了保证重新渲染
const MyComponent = (props) => { return ( <ul> {props.results.map((result) => { return <ListItemWrapper key={result.id} data={result}/>; })} </ul> ); }; 你也可以用一个 实际上浏览器在遍历一个字面量对象的时候会保持顺序一致,除非存在属性值可以被转换成整数值,这种属性值会排序并放在其他属性之前被遍历到,所以为了防止这种情况发生,可以在构建这个字面量的时候在
一般来说,可以直接将这个属性作为父组件的子元素 const Parent = (props) => <div>{props.children}</div>;
组件间通信父子组件间通信这种情况下很简单,就是通过
import React,{Component} from 'react'; import {render} from 'react-dom'; class GroceryList extends Component { handleClick(i) { console.log('You clicked: ' + this.props.items[i]); } render() { return ( <ul> {this.props.items.map((item,i) => { return ( <li onClick={this.handleClick.bind(this,i)} key={i}>{item}</li> ) })} </ul> ) } } render( <GroceryList items={['Apple','Banana','Cranberry']}/>,mountNode );
非父子组件间的通信使用 这种模式在复杂的系统里面可能会变得难以维护,所以看个人权衡是否将组件封装到大的组件,甚至整个页面或者应用就封装到一个组件。 一般来说,对于比较复杂的应用,推荐使用类似 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |