1. JSXjavascript
{}
内放置任何有效的javascript表达式。if
和for
循环代码块中使用JSX。camelCase
(小驼峰命名)来定义属性的名称,而不使用 HTML 属性名称的命名约定。例如在JSX中class变为classNameconst name = 'Jade'; const element = <div> <h1 className='weclome'>Hello, {name}</h1> <input type='text' defaultValue={name} /> </div>; ReactDOM.render( element, document.getElementById('root') );
2. propsjava
3. State异步
constructor
中,state能够传递给子组件,数据是向下流动。关于修改state,应该使用setState()
,而不是直接赋值。ide
this.setState({name: 'Jade'}); //correct
函数
this.state.name = 'jade'; // wrong
this
setState()
为异步,多个setState()
会合并为一个调用。因此最好不要依赖它们的值来更新下一个状态。code
setState()
接受一个函数来解决,该函数接受两个参数,用上一个 state 做为第一个参数,将这次更新被应用时的 props 作为第二个参数。4. 事件处理 component
return false;
阻止默认行为,只能是e.preventDefault()
。JSX中回调问题,事件回调必须绑定this
,否则回调中this
为undefined
。缘由在于js函数工做原理:对象
const obj = { name: 'Jade', say: function () { console.log(this); } }; const test = obj.say; obj.say(); // {name: "Jade", say: ƒ} test(); // undefined
在js中,传递一个函数名给一个变量,而后在变量后加上()调用这个方法,此时方法内部的this的指向就丢失。在React中,OnClick其实就是一个中间变量,因此this
会丢失。事件
关于事件回调中this
丢失的解决办法有如下:
使用bind
绑定this
,<a onClick={this.click.bind(this)}>点击</a>
。
使用箭头函数定义事件回调 this.click = () => { //do something }
使用箭头函数调用事件回调<a onClick={() => this.click()}>点击</a>
事件传递参数的方法有两种,分别是经过箭头函数和bind
,事件对象e会被视为第二个参数,不一样的是,箭头函数的方式必须显式的传入e,bind
则不须要,以下:
* `<a onClick={(e) => this.click(id, e)}>点击</a>` * `<a onClick={this.click.bind(this, id)}>点击</a>`
5. 表单
6. 组件之间通信
// Context 可让咱们无须明确地传遍每个组件,就能将值深刻传递进组件树。 // 使用场景: 嵌套多层的组件,且每层组件可能都会用到某个变量 // 缺点:致使组件的复用性下降 const NameContext = React.createContext('Jade'); // 默认值‘Jade’ class App extends React.Component { render() { return ( // 使用Provider,将变量传递给下面的全部组件 <NameContext.provider value='Jadeee'> <PageHeader /> </NameContext> ) } } class PageHeader extends React.Component { render() { // 中组件不用在手动传递了 return <UserName /> } } class UserName extends React.Component { static contentType = NameContext; render() { return <p> {this.context} </P> } }
// 父子通信主要经过props传递参数,数据自上而下流动,实现父子通信 class ChildrenComponent extends React.Component { constructor(props) { super(props); } render() { return ( {/* 接受从父组件传递而来的title */} <h1> {this.props.title} </h1> ) } } class ParentComponent extends React.Component { constructor(props) { super(props); this.state = { title: '标题' } } render() { return ( {/* 将this.state.title传递给子组件 */} <ChildrenComponent title={this.state.title} /> ) } }
class ChildrenComponent extends React.Component { constructor(props) { super(props); this.state = { name: 'children component' } } clickBtn() { // 调用父组件方法并将参数传递给父组件 this.props.onClickChildren(this.state.name); } render() { return ( <button type="button" onClick={this.clickBtn.bind(this)}> Click Me! </button> ) } } class ParentComponent extends React.Component { constructor(props) { super(props); } // 子组件调用,val参数为子组件传递过来 onClickChildren(val) { console.log(val); // children component } render() { return ( <div> {/* 将onClickChildren()方法做为props传递给子组件 */} <ChildrenComponent onClickChildren={this.onClickChildren.bind(this)} /> </div> ) } }
子子通信: