派大星

vuePress-theme-reco 派大星    2021 - 2022
派大星 派大星
主页
博客
  • 前端
  • JavaScript文章
  • 三级目录
  • 笔记
  • 学习笔记
  • 页面
  • CSS
  • HTML
  • 技术
  • 技术文档
  • GitHub技巧
  • 技术笔记
  • 实用工具
  • Nodejs
  • 博客搭建
  • 更多
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • JavaScript
  • 浏览器&网络
  • 前端框架
  • 资源工具
  • 持续集成
  • 小程序
  • 杂谈
  • React
  • Mysql
  • 面试题
  • uniapp
  • 《ES6 教程》笔记
  • 《Git》学习笔记
  • 《JavaScript教程》笔记
  • 《React》笔记
  • 核心概念
  • 高级指引
  • Hook
  • 案例演示
  • 《TypeScript 从零实现 axios》
  • 初识 TypeScript
  • TypeScript 常用语法
  • ts-axios 项目初始化
  • ts-axios 基础功能实现
  • ts-axios 异常情况处理
  • ts-axios 接口扩展
  • ts-axios 拦截器实现
  • ts-axios 配置化实现
  • ts-axios 取消功能实现
  • ts-axios 更多功能实现
  • ts-axios 单元测试
  • ts-axios 部署与发布
  • 《Vue》笔记
  • 基础
  • 组件
  • 过渡&动画
  • 工具
  • 规模化
  • 可复用性&组合
  • 其他
  • Vuex
标签
时间轴
关于
author-avatar

派大星

272

文章

69

标签

主页
博客
  • 前端
  • JavaScript文章
  • 三级目录
  • 笔记
  • 学习笔记
  • 页面
  • CSS
  • HTML
  • 技术
  • 技术文档
  • GitHub技巧
  • 技术笔记
  • 实用工具
  • Nodejs
  • 博客搭建
  • 更多
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • JavaScript
  • 浏览器&网络
  • 前端框架
  • 资源工具
  • 持续集成
  • 小程序
  • 杂谈
  • React
  • Mysql
  • 面试题
  • uniapp
  • 《ES6 教程》笔记
  • 《Git》学习笔记
  • 《JavaScript教程》笔记
  • 《React》笔记
  • 核心概念
  • 高级指引
  • Hook
  • 案例演示
  • 《TypeScript 从零实现 axios》
  • 初识 TypeScript
  • TypeScript 常用语法
  • ts-axios 项目初始化
  • ts-axios 基础功能实现
  • ts-axios 异常情况处理
  • ts-axios 接口扩展
  • ts-axios 拦截器实现
  • ts-axios 配置化实现
  • ts-axios 取消功能实现
  • ts-axios 更多功能实现
  • ts-axios 单元测试
  • ts-axios 部署与发布
  • 《Vue》笔记
  • 基础
  • 组件
  • 过渡&动画
  • 工具
  • 规模化
  • 可复用性&组合
  • 其他
  • Vuex
标签
时间轴
关于

React学习篇章五

vuePress-theme-reco 派大星    2021 - 2022

React学习篇章五

派大星 2021-01-07 React脚手架

# React05

# 回顾

Hook React16.8 版本引入的新特性 为了能够让 rfc 函数组件使用到 state 和生命周期等。。。

state 引入 useState

const [uname,setUname] = useState('皮卡丘')

以上语法,进行如下工作

  • uname state 对应的 key
  • setUname 修改 uname 的值 姓党与 rcc 中 this.setState({})
  • 最后的是默认值 state 是初始值

修改 state

<button onClick={()=>setUname('雷丘')}></button>

useEffect 组件生命周期

三段

第一段 组件挂载和更新时触发

第二段 组件销毁时触发

第三段 监控更新的数据 [uname]

数据更新时 DOM 渲染 先走第二段 再走第一段

监控数据的时候 拿旧数据 第二段拿 拿新数据第一段

路由系统 react-router

版本 5 目前使用较多 6 版本出来时间不长 还没有得到大规模使用

npm install react-router-dom@5
#不写版本号  就版本6  最新版
npm install react-router-dom

概念:

BrowserRouter 管理整个路由系统

Switch 路由切换组件显示对应的位置 @6 Routes

Route组件和路径的对应关系

  • @5 path 路径 URL 路径 component 组件

  • @6 path 路径 URL 路径 element 标签式调用

    }>

Link 跳转切换 to 跳转到路径

编程方式跳转

  • @5 rcc 写法 路由参数 this.props.match.params‘

    this.props.history.push 跳转方法

  • @6 rfc 写法 路由参数 useParam 跳转方法 useNavigate

Redux

类 Vuex 组件全局状态管理的 组件状态共享

// 导入  createStore
import { createStore } from "redux";
const inistate = {
  num: 1,
};
const reducer = (state = inistate, action) => {
  switch (action.type) {
    case "doAdd":
      return { num: state.num + 1 };
    // 默认返回
    default:
      return state;
  }
};

const store = createStore(reducer);
store.dispatch({ type: "doAdd" });
console.log(store.getState());

// 导入  createStore
import { createStore } from "redux";
/**
 * 练习1 创建一个新的state  count 100
 * 操作方法  每次+10
 * 实现获取和修改
 *
 * 练习2 创建一个新的state skills 初始值是uni-app
 * 添加skills的技能  react react-route react-redux
 * 操作方法  添加数组元素
 * 实现读取和修改添加元素
 */
const inistate = {
  num: 1,
  count: 100,
  skills: ["uni-app"],
};
const reducer = (state = inistate, action) => {
  switch (action.type) {
    case "doAdd":
      return { ...state, num: state.num + 1 };
    // 默认返回
    case "doChange":
      return { ...state, count: state.count + 10 };
    case "addSkill":
      return { ...state, skills: [...state.skills, action.skill] };
    default:
      return state;
  }
};
const store = createStore(reducer);
// 监听器  当state发生改变时 会触发
// store.subscribe(() => {
//   console.log(store.getState());
// });

store.dispatch({ type: "doAdd" });
store.dispatch({ type: "doAdd" });
store.dispatch({ type: "doAdd" });
store.dispatch({ type: "doChange" });
store.dispatch({ type: "addSkill", skill: "react" });
store.dispatch({ type: "addSkill", skill: "react-router" });
store.dispatch({ type: "addSkill", skill: "react-redux" });

console.log(store.getState());

# Redux

使用组件 react-redux 共享组件状态

① 创建 store

/src/store/index.js

import { createStore } from "redux";
const iniState = {
  num: 1,
};
const readucer = (state = iniState, action) => {
  switch (action.type) {
    case "doAdd":
      return { ...state, num: state.num + 1 };

    default:
      // 不做操作时 返回元数据
      return state;
  }
};
// 导出后  外部才可以使用
export const store = createStore(readucer);

② 恢复之前的备份 index.js

/src/index.js

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
// 引入store 不写index 默认也是找index
import { store } from "./store/index";
// Provider  把store注入到组件中
import { Provider } from "react-redux";
ReactDOM.render(
  <React.StrictMode>
    {/* 注入store到根组件 在整个应用中就可以使用到 store */}
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById("root")
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

③ 创建测试组件实现数据共享

/src/components/One.js

// rcredux  快捷生成rcc使用redux
import React, { Component } from 'react'
import { connect } from 'react-redux'

export class One extends Component {
    render() {
        return (
            <div style={{border:"2px solid green"}}>
                One组件
            </div>
        )
    }
}

const mapStateToProps = (state) => ({

})

const mapDispatchToProps = {

}

export default connect(mapStateToProps, mapDispatchToProps)(One)

/src/components/two.js

import React, { Component } from "react";
import { connect } from "react-redux";

export class Two extends Component {
  render() {
    return <div style={{ border: "2px solid blue" }}>Two组件</div>;
  }
}

const mapStateToProps = (state) => ({});

const mapDispatchToProps = {};

export default connect(mapStateToProps, mapDispatchToProps)(Two);

/src/App.js

import React, { Component } from "react";
import One from "./components/One";
import Two from "./components/Two";

export default class App extends Component {
  render() {
    return (
      <div>
        <One />
        <Two />
      </div>
    );
  }
}

# ReactNative 学习

在 RN 代码编写中,开发者服务器是热更新服务器 代码写完之后会立即同步到模拟器 。 代码没写完,就同步过去了,会造成模拟器里 的App崩溃 不要使用 vscode 里的自动保存

image-20220112165231124

# 组件

RN 提供了一套组件进行开发使用,它是官方维护的,兼容性更好一些

官方组件文档:https://reactnative.cn/docs/components-and-apis

# 样式使用