前端框架学习-React(一)

news/2024/7/15 18:27:28 标签: 前端框架, 学习, react.js

React 应用程序是由组件组成的。

  • react 程序是用的jsx语法,使用这种语法的代码需要由babel进行解析,解析成js代码。

    jsx语法:

    1. 只能返回一个根元素

    2. 所有的标签都必须闭合(自闭和或使用一对标签的方式闭合)

    3. 使用驼峰式命名法给大部分属性命名如:className

    4. 大写字母开头的标签一般都是组件

    5. jsx标签的属性,使用引号传递字符串,使用一组{}传递js变量,且大括号中可以写js的表达式,也可以传递使用个另外一对额外的大括号包裹对象。

    6. 标签中可以使用三目运算符

      在 JSX 中,{cond ? <A /> : <B />} 表示 “当 cond 为真值时, 渲染 <A />,否则 <B />

      在 JSX 中,{cond && <A />} 表示 “当 cond 为真值时, 渲染 <A />,否则不进行渲染”

      return (
        <li className="item">
          {isPacked ? name + ' ✔' : name}
        </li>
      );
      
    7. 渲染列表:使用map()方法生成一组相似组件,使用filter()方法来筛选数组

      const listItems = chemists.map(person =>
        <li>...</li> // 隐式地返回!
      );
         
      const listItems = chemists.map(person => { // 花括号
        return <li>...</li>;
      });
      
  • 组件引入语法用到了ES6的模块化编程语法

    1. 解构赋值语法:可以将数组中的值或对象的属性取出,赋值给其他变量。

    2. 展开运算符:

      function Profile({ person, size, isSepia, thickBorder }) {
        return (
          <div className="card">
            <Avatar
              person={person}
              size={size}
              isSepia={isSepia}
              thickBorder={thickBorder}
            />
          </div>
        );
      }
      {/* 关于Avatar那一部分可以写成 */}
      <Avatar {...props} />
      
  • React 三大元素:

    • State对象(要将state视为只读的)

      在数据发生改变之后页面上的内容才会重新渲染、

      • 设置 state 不会更改现有渲染中的变量,会请求一次新的渲染。
      • React 将 state 存储在组件之外,就像在架子上一样。
      • 当你调用 useState 时,React 会为你提供该次渲染 的一张 state 快照。

      更新state对象时要传递一个新的值,即使时一个json对象。

      • 你可以使用这样的 {...obj, something: 'newValue'} 对象展开语法来创建对象的拷贝。

      更新state中的数组:

      推荐使用(会返回一个新数组)
      添加元素concat,[…arr]
      删除元素filter,slice
      替换元素map
      排序先将数组复制一份儿

      可以使用 Immer 来保持代码简洁。

      相同UI树上的元素的State将会被保留,位置不同的组件会使state重置

      • 你可以通过为一个子树指定一个不同的 key 来重置它的 state。
    • props对象

      在标签上添加属性,即可给组件添加prop属性。在子组件中可以通过props读取到对应的属性,解构赋值时可以给一个默认值

      function Avatar({ person, size = 100 }) {
        // ...
      }
      

      组件间共享状态:可以通过状态提升的方式,让后再通过props传递给子组件。

      通过context上下文传递参数

      1. 创建context

        import { createContext } from 'react';
        export const LevelContext = createContext(1);
        
      2. 使用context

        {/* 组件会使用 UI 树中在它上层最近的那个 <LevelContext.Provider> 传递过来的值。 */}
        import { LevelContext } from './LevelContext.js';
        const level = useContext(LevelContext);
        
      3. 提供context

        {/* 在父组件中设定对应的值 */}
        <section className="section">
            <LevelContext.Provider value={level}>
          		{children}
            </LevelContext.Provider>
        </section>
        
    • ref对象

  • React的交互:

    • 给元素的事件传递一个函数,而调用一个函数。

      <button onClick={handleClick}> {/* 正确 */}
      <button onClick={handleClick()}>{/* 错误 */}
      
  • 在 React 中,useState 以及任何其他以“use”开头的函数都被称为 Hook

    • 使用useImmerReducer可以将通知同一个state的方法,组织到一起。提高代码的可读性。

      • useState转化为useReducer
        1. 通过事件处理函数 dispatch actions;
        2. 编写一个 reducer 函数,它接受传入的 state 和一个 action,并返回一个新的 state;
        3. 使用 useReducer 替换 useState
      import { useImmerReducer } from 'use-immer';
      import AddTask from './AddTask.js';
      import TaskList from './TaskList.js';
      
      function tasksReducer(draft, action) {
        switch (action.type) {
          case 'changed': {
            const index = draft.findIndex((t) => t.id === action.task.id);
            draft[index] = action.task;
            break;
          }
          case 'deleted': {
            return draft.filter((t) => t.id !== action.id);
          }
          default: {
            throw Error('未知 action:' + action.type);
          }
        }
      }
      
      export default function TaskApp() {
        const [tasks, dispatch] = useImmerReducer(tasksReducer, initialTasks);
        function handleChangeTask(task) {
          dispatch({
            type: 'changed',
            task: task,
          });
        }
        function handleDeleteTask(taskId) {
          dispatch({
            type: 'deleted',
            id: taskId,
          });
        }
        return (
          <>
            <h1>布拉格的行程安排</h1>
            <AddTask onAddTask={handleAddTask} />
            <TaskList
              tasks={tasks}
              onChangeTask={handleChangeTask}
              onDeleteTask={handleDeleteTask}
            />
          </>
        );
      }
      let nextId = 3;
      const initialTasks = [
        {id: 0, text: '参观卡夫卡博物馆', done: true},
        {id: 1, text: '看木偶戏', done: false},
        {id: 2, text: '打卡列侬墙', done: false},
      ];
      
      

http://www.niftyadmin.cn/n/4947268.html

相关文章

Arcgis连续数据的分类(求不同值域的面积)

问题描述&#xff1a;如果得到的一个连续的影响数值数据&#xff0c;但是我们想求取某一段值域的面积占比&#xff0c;需要进行以下操作&#xff1a; 1.按照数值重分类&#xff0c;将某段数值变成一个类别 2.栅格转矢量&#xff0c;再求取面积

MYSQL线上无锁添加索引

在需求上线过程中&#xff0c;经常会往一个数据量比较大的数据表中的字段加索引&#xff0c;一张几百万数据的表&#xff0c;加个索引往往要几分钟起步。在这段时间内&#xff0c;保证服务的正常功能运行十分重要&#xff0c;所以需要线上无锁添加索引&#xff0c;即加索引的语…

32.Netty源码之服务端如何处理客户端新建连接

highlight: arduino-light 服务端如何处理客户端新建连接 Netty 服务端完全启动后&#xff0c;就可以对外工作了。接下来 Netty 服务端是如何处理客户端新建连接的呢&#xff1f; 主要分为四步&#xff1a; md Boss NioEventLoop 线程轮询客户端新连接 OP_ACCEPT 事件&#xff…

容器和云原生(二):Docker容器化技术

目录 Docker容器的使用 Docker容器关键技术 Namespace Cgroups UnionFS Docker容器的使用 首先直观地了解docker如何安装使用&#xff0c;并快速启动mysql服务的&#xff0c;启动时候绑定主机上的3306端口&#xff0c;查找mysql容器的ip&#xff0c;使用mysql -h contain…

工作流引擎之Flowable教程(整合SpringBoot)

简介 Flowable是什么&#xff0c;下面是官方文档介绍&#xff1a; Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义&#xff08;用于定义流程的行业XML标准&#xff09;&#xff0c; 创建这些流程定义的流程实例&#xff0c;进行…

ts与vue

ts与Vue 如果你已经学习了typeScript,但不知道如何在vue项目中使用&#xff0c;那么这篇文章将会很适合你。参考千峰教育 kerwin视频 1.会自动推导&#xff0c;隐士推导。提示 类型系统。 独立模块。 isolatedModules选项&#xff1a;是否配置为独立的模块。 减少报错 let …

【仿写框架之仿写Tomact】一、Tomcat的工作流程

文章目录 1、启动阶段2、监听阶段&#xff1a;3、请求处理阶段&#xff1a;4、发送请求处理后的响应 当涉及到Java Web应用程序的部署和运行&#xff0c;Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器…

每天一道leetcode:433. 最小基因变化(图论中等广度优先遍历)

今日份题目&#xff1a; 基因序列可以表示为一条由 8 个字符组成的字符串&#xff0c;其中每个字符都是 A、C、G 和 T 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 例如&#xff0c;&quo…