ReactDOM.render() 会使用你的 JSX来替换你的 HTML 中的一个 DOM 节点。
ReactDOM.render()有两个传入参数。第一个是准备渲染的 JSX。第二个参数指定了 React应用在你的 HTML 中的放置的位置。
示例:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './index.css';
ReactDOM.render(
,
document.getElementById('root')
);
用 create-react-app 创建的项目,保存时浏览器能够自动刷新;
但是有点时候我们并不希望浏览器刷新也没,因为可能会打断我们的debug状态,比如说console/network中输出的内容
模块热替换(HMR)是一个帮助你在浏览器中重新加载应用的工具,并且无需再让浏览
器刷新页面。
示例:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import './index.css';
ReactDOM.render(
,
document.getElementById('root')
);
if (module.hot) {
module.hot.accept();
}
import React, { Component } from 'react';
...
class App extends Component {
render() {
...
}
}
Component 类是从一个基本ES6类中继承来的 ES6组件类。它有一个React组件所需要的所有功能。
render()方法是必须被重写的方法,因为它定义了一个React组件的输出。它必须被定义。
ES6中,初始化对象时,属性名和变量名同名时,可以简写属性,如:
const name = 'Robin';
const user = {
name: name,
};
可以被简写成:
const name = 'Robin';
const user = {
name,
};
方法名也可以简化,比如:
// ES5
var userService = {
getUserName: function (user) {
return user.firstname + ' ' + user.lastname;
},
};
// ES6
const userService = {
getUserName(user) {
return user.firstname + ' ' + user.lastname;
},
};
ES6中使用计算属性名:
// ES5
var user = {
name: 'Robin',
};
// ES6
const key = 'name';
const user = {
[key]: 'Robin',
};
为什么需要绑定:因为类的方法,不会自动绑定到实例的this上面。如下代码的this.onClickMe是undefine的:
class ExplainBindingsComponent extends Component {
onClickMe() {
console.log(this);
}
render() {
return (
);
}
}
正解:
class ExplainBindingsComponent extends Component {
constructor() {
super();
this.onClickMe = this.onClickMe.bind(this);
}
onClickMe() {
console.log(this);
}
render() {
return (
);
}
}
关于绑定的一些建议:
class ExplainBindingsComponent extends Component {
onClickMe = () => {
console.log(this);
}
render() {
return (
);
}
}
表单元素比如 , 和 会以原生 HTML 的形式保存他
们自己的状态。一旦有人从外部做了一些修改,它们就会修改内部的值,在 React 中这被
称为不受控组件,因为它们自己处理状态。在 React 中,你应该确保这些元素变为受控组
件。
示例:
class App extends Component {
...
render() {
const { searchTerm, list } = this.state;
return (
...
);
}
}
当单个组件逻辑过于复杂时,应该对组件进行拆分。组件拆分时涉及到同组件和父子组件之间的数据流传递。同组件之间可以用this.state传递。父组件像子组件传值,子组件可以通过this.props去获取。
props中有个特殊的变量children;它包含了子组件实例内的元素树。这使得组件之间相互组合变得更为方便;
比如:
Search
在Search类中调用props.children即可使用Search实例包含的内容;
class Search extends Component {
render() {
const {value,onChange, children} = this.props
return(
);
}
}
有时候会看到一些看起来无用的封装,比如:
class Button extends Component {
render () {
const {
onClick,
className='',
children
} = this.props;
return (
);
}
}
但是这会帮你管控左右的被封装组件,只需修改封装内容,就可以实现批量修改的效果;
将Button重构为无状态组件(入参直接将props解构了):
const Button = ({onClick,className='',children}) =>