React 是一个用于构建用户界面的 JavaScript 库。
- 采用组件化模式、声明式编码,提高开发效率及组件复用率。
- 在 React Native 中可以使用 React 语法进行移动端开发。
- 使用虚拟 DOM 和优秀的 Diffing 算法,尽量减少与真实 DOM 的交互。
关于虚拟 DOM:
- 本质是 Object 类型的对象(一般对象)
- 虚拟 DOM 比较“轻”,真实DOM比较“重”,因为虚拟 DOM 是 React 内部在用,无需真实 DOM 上那么多的属性。
- 虚拟 DOM 最终会被 React 转化为真实 DOM,呈现在页面上。
A4-JSX创建虚拟DOM
使用 React
通过 script 标签引入
1 2 3 4 5 6
| <script type="text/javascript" src="../js/react.development.js"></script>
<script type="text/javascript" src="../js/react-dom.development.js"></script>
<script type="text/javascript" src="../js/babel.min.js"></script>
|
注意引入顺序
创建虚拟 DOM
使用原生 JS 语法创建(不推荐)
1 2 3 4 5 6 7 8 9 10
| <div id="test"></div>
<script type="text/javascript"> const VDOM = React.createElement('h1', { id: 'title' }, React.createElement('span', {}, 'Hello,React')) ReactDOM.render(VDOM, document.getElementById('test')) </script>
|
A3-JS创建虚拟DOM.html
使用 JSX 创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <div id="test"></div>
<script type="text/babel"> const VDOM =( <h1 id="title"> <span>Hello,React</span> </h1> ) ReactDOM.render(VDOM,document.getElementById('test')) const TDOM = document.getElementById('test') console.log("虚拟DOM",VDOM); console.log("虚拟DOM",typeof VDOM); console.log("真实DOM",TDOM); debugger </script>
|
A4-JSX创建虚拟DOM.html
JSX 语法
JSX 语法规则:
- 定义虚拟 DOM 时,不要写引号。
- 标签中混入 JS 表达式时要用
{}。
- 样式的类名指定不要用
class,要用 className。
- 内联样式,要用
style={{key:value}} 的形式去写。
- 只有一个根标签
- 标签必须闭合
- 标签首字母:若小写字母开头,则将该标签转为 html 中同名元素,若 html 中无该标签对应的同名元素,则报错。若大写字母开头,react 就去渲染对应的组件,若组件没有定义,则报错。
B-JSX语法规则
定义组件
函数式组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <div id="test"></div>
<script type="text/babel"> function MyComponent(){ console.log(this); return <h2>我是用函数定义的组件(适用于【简单组件】的定义)</h2> } ReactDOM.render(<MyComponent/>,document.getElementById('test')) /* 执行了ReactDOM.render(<MyComponent/>.......之后,发生了什么? 1.React解析组件标签,找到了MyComponent组件。 2.发现组件是使用函数定义的,随后调用该函数,将返回的虚拟DOM转为真实DOM,随后呈现在页面中。 */ </script>
|
C1-定义组件函数式组件.html
类式组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <div id="test"></div>
<script type="text/babel"> class MyComponent extends React.Component { render(){ console.log('render中的this:',this); return <h2>我是用类定义的组件(适用于【复杂组件】的定义)</h2> } } ReactDOM.render(<MyComponent/>,document.getElementById('test')) /* 执行了ReactDOM.render(<MyComponent/>.......之后,发生了什么? 1.React解析组件标签,找到了MyComponent组件。 2.发现组件是使用类定义的,随后new出来该类的实例,并通过该实例调用到原型上的render方法。 3.将render返回的虚拟DOM转为真实DOM,随后呈现在页面中。 */ </script>
|
主键的三大属性
state
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| <div id="test"></div>
<script type="text/babel"> class Weather extends React.Component{ constructor(props){ console.log('constructor'); super(props) this.state = {isHot:false,wind:'微风'} this.changeWeather = this.changeWeather.bind(this) }
render(){ console.log('render'); const {isHot,wind} = this.state return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1> }
changeWeather(){ console.log('changeWeather'); const isHot = this.state.isHot this.setState({isHot:!isHot}) console.log(this);
} } ReactDOM.render(<Weather/>,document.getElementById('test')) </script>
|
state 简写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <div id="test"></div>
<script type="text/babel"> class Weather extends React.Component{ state = {isHot:false,wind:'微风'}
render(){ const {isHot,wind} = this.state return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1> }
changeWeather = ()=>{ const isHot = this.state.isHot this.setState({isHot:!isHot}) } } ReactDOM.render(<Weather/>,document.getElementById('test')) </script>
|
props
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <div id="test1"></div> <div id="test2"></div> <div id="test3"></div>
<script type="text/babel"> class Person extends React.Component{ render(){ const {name,age,sex} = this.props return ( <ul> <li>姓名:{name}</li> <li>性别:{sex}</li> <li>年龄:{age+1}</li> </ul> ) } } ReactDOM.render(<Person name="jerry" age={19} sex="男"/>,document.getElementById('test1')) ReactDOM.render(<Person name="tom" age={18} sex="女"/>,document.getElementById('test2'))
const p = {name:'老刘',age:18,sex:'女'} // ReactDOM.render(<Person name={p.name} age={p.age} sex={p.sex}/>,document.getElementById('test3')) ReactDOM.render(<Person {...p}/>,document.getElementById('test3')) </script>
|
对 props 进行限制
注意需要引入 prop-types.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <div id="test1"></div> <div id="test2"></div> <div id="test3"></div>
<script type="text/javascript" src="../js/prop-types.js"></script>
<script type="text/babel"> class Person extends React.Component{ render(){ const {name,age,sex} = this.props return ( <ul> <li>姓名:{name}</li> <li>性别:{sex}</li> <li>年龄:{age+1}</li> </ul> ) } } Person.propTypes = { name:PropTypes.string.isRequired, sex:PropTypes.string, age:PropTypes.number, speak:PropTypes.func, } Person.defaultProps = { sex:'男', age:18 } ReactDOM.render(<Person name={100} speak={speak}/>,document.getElementById('test1')) ReactDOM.render(<Person name="tom" age={18} sex="女"/>,document.getElementById('test2'))
const p = {name:'老刘',age:18,sex:'女'} // ReactDOM.render(<Person name={p.name} age={p.age} sex={p.sex}/>,document.getElementById('test3')) ReactDOM.render(<Person {...p}/>,document.getElementById('test3'))
function speak(){ console.log('我说话了'); } </script>
|
props 的简写方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <div id="test1"></div> <div id="test2"></div> <div id="test3"></div>
<script type="text/javascript" src="../js/prop-types.js"></script>
<script type="text/babel"> class Person extends React.Component{
constructor(props){ super(props) console.log('constructor',this.props); }
static propTypes = { name:PropTypes.string.isRequired, sex:PropTypes.string, age:PropTypes.number, }
static defaultProps = { sex:'男', age:18 } render(){ const {name,age,sex} = this.props return ( <ul> <li>姓名:{name}</li> <li>性别:{sex}</li> <li>年龄:{age+1}</li> </ul> ) } }
ReactDOM.render(<Person name="jerry"/>,document.getElementById('test1')) </script>
|