create project folder

  1. mkdir new_project
  2. cd new_project

npm init 初始化 项目

npm i webpack webpack-cli

配置 package.json

  1. "script": {
  2. "build": "webpack --config script/webpack.config.js" # 可以配置 webpack 配置文件的地址
  3. }

npm run dev 可以 执行 预设 的命令进行打包

配置 webpack.config.js

可以默认配置,或者可以自己配置。

  1. const path = require('path')
  2. module.exports = {
  3. mode: 'development',
  4. entry: './src/index.js',
  5. output: {
  6. // path: path.join(__dirname, 'dist'),
  7. // path: path.resolve(__dirname, 'dist'),
  8. path: path.resolve(process.cwd(), 'dist'),
  9. filename: 'main.js'
  10. }
  11. }
  12. # process.cwd() ???
  1. module.exports = {
  2. // entry 可以配置一个对象,从而,配置多个入口文件,
  3. entry: {
  4. home: './src/home.js',
  5. about: './src/about.js'
  6. },
  7. output: {
  8. path: path.resolve(__dirname, 'dist'),
  9. // filename: '[name].[chash].js'
  10. filename: '[name].[chunkHash:8].js'
  11. }
  12. }

css 预处理器

图片资源预处理器

静态资源

babel

cra

类组件

jsx 原理

目录结构

组件的目录结构

  1. 单个组件大驼峰命名目录
  2. 组件 写在 index.js 文件中
  3. 私有组件 直接写在 当前调用的组件文件夹内
  4. 导出: 在 components/index.js 统一处理 导出逻辑
    1. // 目录结构:
    2. /*
    3. components
    4. TodoHeader
    5. index.js
    6. TodoInput
    7. index.js
    8. TodoList
    9. TodoItem.js
    10. index.js
    11. */
    12. // 导出:
    13. import TodoHeader from './TodoHeader'
    14. import TodoInput from './TodoInput'
    15. import TodoList from './TodoList'
    16. // export {
    17. // TodoHeader,
    18. // TodoInput,
    19. // TodoList
    20. // }
    21. // or
    22. export { default as TodoHeader } from './TodoHeader'
    23. export { default as TodoInput } from './TodoInput'
    24. export { default as TodoList } from './TodoList'

    Fragment 空白组件

    props: 组件的数据挂载

    父组件给子组件传值

    1. // 父组件
    2. render(){
    3. return (
    4. // 使用子组件的时候,传值
    5. <TodoHeader desc="something" x={1}>
    6. 待办事项
    7. </TodoHeader>
    8. )
    9. }
    10. // 子组件
    11. 通过 props 可以拿到 props {desc:'somrthing', children: '待办事项'}
    12. // 在子组件中渲染
    13. render(){
    14. return (
    15. <div>
    16. <h1>{this.props.children}</h1>
    17. <h2>{this.props.desc}</h2>
    18. </div>
    19. )
    20. }

    prop-types 进行类型校验

    执行安装命令:npm i prop-type
    1. import ReactTypes from 'prop-type'
    2. // 无状态组件中校验
    3. TodoHeader.ReactTypes = {
    4. desc: ReactTypes.string,
    5. x: ReactTypes.number.isRequired
    6. }
    7. TodoHeader.defaulTypes = {
    8. count ReactTypes.number // 为props 设置 类型校验
    9. }
    10. // 有状态组件的校验
    11. static defaultProps = {
    12. count: 0 // 为 props 设置默认值
    13. }
    14. static defaulTypes = {
    15. count ReactTypes.number // 为props 设置 类型校验
    16. }

    组件的内部数据 state

    this.state.someData 读取 data
    this.setState({}) 设置 data

    setState 是异步的

    1. this.setState(
    2. prevState => {
    3. return {
    4. isLiked: !prevState.isLiked
    5. }
    6. },
    7. () => {
    8. // 这里获取到的 才是最新的
    9. console.log(this.state.isLiked)
    10. }
    11. )

    渲染富文本内容 dangerouslySetInnerHTML,接收一个 __html 对象

    1. function MyComponent() {
    2. return <div dangerouslySetInnerHTML={{ __html: this.state.article }} />
    3. }

    事件

    onChange 事件处理表单输入

    1. constructor(){
    2. this.state = {
    3. inputValue: 'something else'
    4. }
    5. }
    6. handleInputChange= (e) => {
    7. this.setState({
    8. inputValue: e.currentTarget.value
    9. })
    10. }
    11. render(){
    12. return (
    13. <div>
    14. <input
    15. type="text"
    16. value={this.state.inputValue}
    17. onChange={this.handleInputChange}
    18. />
    19. </div>
    20. )
    21. }

    ref及键盘事件

    生命周期

    使用Ajax

  • 安装axios
    npm i axios -S

    React-Hooks

    需要先引入
    1. import React, {useState, useEffect} from 'react'
    2. // userState 是一个方法,方法的参数就是默认值;返回的结果是一个数组,数组的第个值就是 state, 第二个 相当于 setState
    3. // 解构出来
    4. const {count, setCount} = useState(0)
    5. `<span>{count}</span>`
    6. `<button onClick={()=>{ setCount(count + 1) }}></button>`
    7. // count => 0
    8. // setCount => func,
    9. useEffect(()=>{
    10. // 组件的每次渲染,都会触发 useEffect,类似于 componentDidMount和componentDidUpdate
    11. })

    context

    HOC

    基础

    @装饰器模式

  1. 装包:react-app-rewired
  2. 安装之后,在package.json中将scripts里的react-scripts替换成react-app-rewired
  3. 在根目录中创建文件config.oberrides.js

    1. mudule.exports = (config) => {
    2. // 在这里去配置
    3. reurn config
    4. }
  4. 配置更方便,安装customize-cra,然后config-overrides.js文件修改

    1. const {override, addDecoratorsLegacy} = require('customize-cra')
    2. module.exports = override(
    3. addDecoratorsLegacy()
    4. )

    状态管理

    Flux

    Redux

    路由 React Router

    安装

    1. npm i react-router-dom -S

    组件

    BrowserRouter HashRouter
    Route Link Redirect

    路由API

    1. // params 传递 /artical/:id
    2. <Link to="/artical/2">首页</Link>
    3. // query 解析
    4. <Link to="/artical/2?from=artical">首页</Link>
    5. // 使用 state 隐式传参
    6. <Link to={{
    7. pathname: '/artical/2',
    8. state: { // 可以在 history 的 location 中拿到
    9. from: 'artical'
    10. }
    11. }}>首页</Link>
    12. <Route component={Home} path="/home" />
    13. // 也可以用 render 函数进行渲染
    14. <Route render={(props) => {
    15. // props 可以拿到 history 等参数,便于往下传递
    16. return <Home x={1} ...props />
    17. }} path="/home" />

    编程式导航

    1. this.props.history.push('/home')
    2. this.props.history.push({
    3. pathname: '/home',
    4. state: {
    5. id: this,props.match.parasm.id
    6. }
    7. })

    高阶组件

    withRouter

    Mbox

    扩展

    Immutable.js

    埋点:

    发送数据:

  5. Ajax

  6. img 图片带参数

    1. const img = new Image()
    2. img.src="http://ssdsdd.c/1.png?x=1&y=2" // 兼容性
    1. sendBeacon