引入
CDN
- 用 umd,兼容各种浏览器
- 需要引入 React 与 ReactDOM
- CDN 引入的会变成全局变量
// index.html
<body><script src="https://cdn.bootcdn.net/ajax/libs/react/17.0.1/umd/react.production.min.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script><script>console.log(window.React)</script></body>
- cjs 和 umd 的区别:cjs(CommonJS)是 Node.js 支持的规范模块,umd 是同意模块定义,兼容各种模块规范(同时支持 Node.js 和浏览器),一般先使用 umd。最新的模块规范是使用 import 和 export 关键字。
通过 webpack 引入 React
yarn add react react-dom
import React from 'react;import ReactDOM from 'react-dom';
create-react-app
create-react-app
目前使用这个
安装
yarn global add create-react-app
创建项目 react-demo-1
create-react-app react-demo-1
在当前目录下创建,使用 Typescript
create-react-app . --template typescript
开发
cd react-demo-1yarn start
结局每次 yarn start 后自动新开窗口的问题:创建 .env 文件
BROWSER = none
配置项目请看 React 项目配置
使用 React 开发
利用函数回调实现响应式,即值变化就调用函数重新渲染
- React.creatElement 返回的是一个虚拟 DOM对象(代表一个 div),该函数可多次执行,每次得到最新的虚拟 DOM,React 会找出两个虚拟 DOM 的不同(DOM Diff 算法)局部更新视图
- React.creatElement(elem, attr, elem.innerHTML),其中,参数 elem 若传入:
- 字符串 ‘div’,则创建 div 元素
- 函数,则调用函数,获取返回值
- 类,则 new 一个组件对象(执行 constructor),然后调用组件的 render 方法,获取返回值
- React.creatElement 第二个参数 attr 传入属性:style ,事件等
- ReactDOM.render(App(), root) 相当于 root.innerHTML = App()
+1 按钮
import React from 'react';import ReactDOM from 'react-dom';const root = document.querySelector('#root');let n = 0;const App = () => React.createElement('div', null, [n,React.createElement('button', {onClick: () => {n += 1;ReactDOM.render(App(), root);// 每次 n 变化,就使用回调重新渲染,因此 APP 最好定义为一个函数而不是 DOM 元素}}, '+1')])ReactDOM.render(App(), root);
App = React.creatElement('div', null, n) 是一个 React 元素,会立即执行。App = () => React.creatElement('div', null, n) 是一个函数组件,调用时才执行。
此处说的是函数额调用时机,不是同步和异步,同步和异步的差别是得到结果的时机
