react环境

news2024/11/17 7:47:40

目录

一、React环境安装

1. vite集成

2. 官方脚手架

二、React特点

三、基础语法

1. JSX语法

2. 组件的写法——类组件/方法

3. 循环渲染

4. 条件渲染

5. css样式

 6. 响应式状态——useState


一、React环境安装

1. vite集成

npm init vite@latest==> 创建项目名==> 选react==> 选程序语言(js/ts)==> cd项目名称/项目目录下启动命令行(cmd)==> npm i ==> npm run dev

2. 官方脚手架

cnpm install -g create-react-app ==> create-react-app my-app(创建项目,应用名称不要有大写字母) ==> cd my-app(进入项目目录) ==> npm run start (启动项目) ==> npm run build (打包)

二、React特点

1. 优势:声明式设计

                高效——虚拟DOM、Diff算法

2. 灵活:可能性更多,可以自由组合

3. JSX

4. 组件:通过 React 构建组件,使得代码更加容易得到复用

三、基础语法

理解:ReactDOM.createRoot(document.getElementById("app")).render(<App/>)

ReactDOM对象,createRoot函数(获取元素),render函数(参数为App标签) 。App代表一个组件(函数、类),<App/>代表组件对象

知识点:render函数是官方自动调用的。

              getElementById是获取元素速度最快的方式

              复习:js中函数参数类型:数字、布尔值、字符串、对象、函数、null、undefined

但这里render函数的参数是一个标签,而js语法中不能用标签作为参数,所以出现了JSX语法

1. JSX语法

在react中,js中可以写标签,标签中可以写js。js语法遇到<>识别为标签,标签中遇到{} 就识别为js语法环境。但浏览器读不懂JSX语法,react打包时,加载器会把JSX语法翻译成js语法——jsx对象==>js对象(VNode虚拟节点对象)。

return的代码中能够嵌套多个 HTML 标签,但需要使用一个父元素标签包裹它们。

案例:

// main.jsx中
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.jsx'

ReactDOM.createRoot(document.getElementById('root')).render(<App />);

// App.jsx中
import { Component } from "react";
// 类组件
export default class App extends Component {
  render() {
    let msg = "hello";
    function fn() {
      return 123;
    }
    return (
      <div>
        {msg}
        <p>{msg}</p>
        <span>{fn()}</span>
      </div>
    );
  }
}

除了类组件外,写成函数会更好。

import React from 'react'

export default function App() {
  let msg = 'test';
  return (
    <div>{ msg}</div>
  )
}

     

2. 组件的写法——类组件/方法

无论是类组件写法还是函数的写法,都可以使用快捷键来完成,但需要安装react相关插件。

rcc ==> react class component                                                     rcf ==> react function component

老版本中的函数组件——纯组件,不具备响应式。也就是说当更改数据时,页面中使用到该变量的地方不会跟着刷新。

import { Component } from "react";

export default class App extends Component {
  render() {
    let msg = "hello";
    function getmsg() {
      console.log('获取msg='+msg);
    }
    function setmsg() {
      msg = 'world';
      console.log("修改了msg");
    }
    return (
      <div>
        <p>{msg}</p>
        <button onClick={getmsg}>获取msg</button>
        <button onClick={setmsg}>修改msg</button>
      </div>
    );
  }
}

 通过上面的结果可以验证,当修改了msg后,控制台获取的msg已经由hello变为了world,但页面中显示的还是原始数据hello。

新版本(16.8后)的函数组件——可以使用官方API来让函数内部的变量成为一个响应式变量,解决了上面的问题,下面的知识点会讲解。

3. 循环渲染

因为react框架没有指令,所以条件渲染和循环渲染得自己利用逻辑来完成渲染。

如果插值表达式中,插入的是一个数组,react会将数组中的每个元素渲染到页面中。当直接将整个数组渲染到页面中时,可以看到数组中的元素并列展示在页面中;如果想要他们具有一定的样式,可以使用map方法,循环为每个元素都加上相同的样式。如下:

4. 条件渲染

react环境中的条件渲染,可以利用js语法中三目运算符,或者' || ' 或 ' && '来实现。这里需要复习一下或语法。

比如:A || B最终结果不一定只能是true或false,而是A/B表达式。当A为true时,结果为表达式A;A为false,结果为B表达式。

import React, { Component } from "react";

export default class App extends Component {
  render() {
    let flag = false;
    let flag1 = true;
    let a = "hello";
    let b = "world";
    let fn = (arg) => {
      return arg ? <a>aaa</a> : <b>bbb</b>;
    };
    return (
      <div>
        <h3>{flag ? a : b}</h3>
        <h3>{flag || a}</h3>
        <h3>{flag1 || a}</h3>
        <h3>{flag ? <a href="#">aaa</a> : <b>bbb</b>}</h3>
        <h3>{fn(true)}</h3>
      </div>
    );
  }
}

5. css样式

类为className,是为了和类class区分。css样式的引入可以使用行内样式,也可以是外联样式,只是外联样式可以是全局的,也可以是局部的。当引入局部样式时,css文件名的后缀为.module.css。

import React from 'react'
import box from './box.css'
import obj from "./box2.module.css";
// 外部引入时需要用变量来接收,obj为整个样式对象,通过点语法来选择想要用哪个样式
export default function App() {
  // js环境中使用小驼峰命名法
  let mystyle = { backgroundColor: 'pink', width: '100px', height: '100px' };
  let c = 'red';
  return (
    <div>
      <div style={mystyle}>行内样式</div>
      <div style={{ color: c }}>行内样式2</div>
      <div className='box'>
        外联全局样式
      </div>
      <div className={obj.box2}>
        外联局部样式
      </div>
    </div>
  );
}

 6. 响应式状态——useState

前面的2点中写了普通的数据,当我们变量时,页面并不会跟着刷新,所以需要使用官方提供的API来将数据变为响应式的,类似vue中的ref。

用法:arr只有两个元素,第一个为状态,第二个是函数,调用该函数,那传入的数据会去修改第一个元素并刷新页面。

import { useState } from "react";

export default function App() {
  let arr = useState("hello,xzq");
  let get = () => {
    console.log("查看", arr[0]);
  };
  function set() {
    // arr[0]='修改了数据'  只是修改了数据 但不会驱动页面刷新
    arr[1]("hi,qy");
    // arr[1]为函数,()为函数调用,hi,qy为修改过后的值
    console.log("修改", arr[0]);
  }
  return (
    <div>
      <h2>app页面</h2>
      <b>{arr[0]}</b>
      <button onClick={get}>get</button>
      <button onClick={set}>set</button>
    </div>
  );
}

上面的代码可以使用es6中的解构赋值来写,这样的写法更简洁、常用,结果还是一样的。

import { useState } from "react";

export default function App() {
  let [msg, setMsg] = useState("hello,xzq");
  let get = () => {
    console.log("查看", msg);
  };
  function set() {
    setMsg("修改了msg为world");
    console.log("修改", msg);
  }
  return (
    <div>
      <b>{msg}</b>
      <button onClick={get}>get</button>
      <button onClick={set}>set</button>
    </div>
  );
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数分面试题-AB测试

目录标题 1、ABtest实验目的2、A/Btest是什么&#xff1f;意义/目的/作用3、A/Btest工作原理4、A/B test流程&#xff08;面试喜欢问&#xff09;5、一个实际的ABtest案例6、AB实验的注意事项6.1 网络效应&#xff1a;一个用户影响另一个用户6.2 学习效应&#xff1a;新奇效应6…

前端开发:JS中堆和栈的区别

前言 在前端实际开发中&#xff0c;有关JS原生的堆和栈也是很重要的点&#xff0c;关于底层和原理的掌握使用&#xff0c;尤其是在性能优化方面甚为重要。众所周知&#xff0c;JS的变量都是存放在内存中的&#xff0c;而且内存给变量开辟了两块区域&#xff0c;即堆区域和栈区域…

头条_signature

文章目录 0x0目标url0x1接口分析0x2定位0x3调试分析0x4扣代码&#xff0c;补环境0x5运行测试0x6相关代码 0x0目标url aHR0cHM6Ly93d3cudG91dGlhby5jb20 0x1接口分析 打开开发者工具&#xff0c;在xhr下可以找到相关接口 _signature由js算法生成 0x2定位 这里通过全局搜索的…

lesson 12 Zigbee绑定通信

目录 Zigbee绑定通信 通信原理 实验过程 实现步骤 实验现象 实验分析 Zigbee绑定通信 通信原理 1、Zigbee一共有五种通信方式&#xff1a;单播、广播、组播、MAC、广播 2、绑定是Zigbee的一种基本通信方式&#xff0c;具体绑定通信又分为三种模式&#xff0c;模式大同…

C++之std::move用法(一百四十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

最长回文串

Manacher 问题 寻找字符串中的最长回文串 传统做法 字符串首字符前加一个特殊字符 ‘#’ 末尾字符加一个特殊字符 ‘#’ 相邻字符间也加上特殊字符 ‘#’ 遍历字符串&#xff0c;除特殊字符外&#xff0c;以每个字符作为回文字符串的中心向外扩张 思考 很明显这种做法的…

吴恩达ChatGPT《LangChain for LLM Application Development》笔记

基于 LangChain 的 LLM 应用开发 1. 介绍 现在&#xff0c;使用 Prompt 可以快速开发一个应用程序&#xff0c;但是一个应用程序可能需要多次写Prompt&#xff0c;并对 LLM 的输出结果进行解析。因此&#xff0c;需要编写很多胶水代码。 Harrison Chase 创建的 LangChain 框…

基于Mybatis的数据权限拦截器实现

目录 一、背景二、动机三、实现思路3.1 权限类型、操作类型3.2 统一用户及数据权限集合模型3.3 定义数据权限拦截注解3.4 提取配置属性3.5 数据权限拦截器实现 四、集成方式五、关于D3S 一、背景 最近一直在做RBAC相关的架构设计与实现&#xff0c;传统的RBAC的权限控制只是控…

2023CCF CAT- 全国算法精英大赛

目录 A Flower B Tree C Best Travel Plans D Hearthstone E Hotpot F Mystery Sailing Challenge G Card H The diameter of a rectangle I Tourist J Mysterious Rune String A Flower B Tree C Best Travel Plans D Hearthstone E Hotpot F Mystery Sailing Challe…

Git标签管理

目录 标签介绍 创建标签 删除标签 推送标签到远程仓库 标签介绍 标签tag&#xff0c;可以理解为是对某次commit 的一个标识&#xff0c;相当于起了一个别名。 比如说有些重要的commit id 难以记住&#xff0c;这时候就可以利用tag给这个commit id 起一个有意义的名字&…

【QT】图形化页面设计

可视化的图形化界面共有三种设计方式&#xff0c;一种是通过可视化来设计界面的方式&#xff1b;一种是代码化的设计方式&#xff1b;最后是混合上面两种的混合界面设计方式。目前我们只考虑通过Designer和代码来设计图形化页面的两种方式。 目录 可视化图形界面设计 图形页…

数字信号的载波传输

从信号传输质量来看&#xff0c;数字系统优于模拟系统。 由于数字基带信号的频谱包含低频成分&#xff0c;而许多重要的通信信道是带通型的&#xff0c;比如无线信道和许多有线信道&#xff0c;这时需要调制成数字频带信号。 数字调制与模拟调制原理基本相似&#xff0c;有调幅…

ChatGLM-6B详细学习实践记录与资料分享

随着年初chatGPT产品的退出和迭代发展&#xff0c;凭借一己之力将大模型带火&#xff0c;国产很多厂商后续也陆续跟进开始投入研发属于自己的大模型产品&#xff0c;在这段时间里面陆陆续续出来了很多不同的产品&#xff0c;比如&#xff1a;文心一言、星火大模型、通义千问、商…

吴恩达AIGC《How Diffusion Models Work》笔记

1. Introduction Midjourney&#xff0c;Stable Diffusion&#xff0c;DALL-E等产品能够仅通过Prompt就能够生成图像。本课程将介绍这些应用背后算法的原理。 课程地址&#xff1a;https://learn.deeplearning.ai/diffusion-models/ 2. Intuition 本小节将介绍扩散模型的基础…

gof23设计模式之代理模型

1. 代理模式 1.1. 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不能直接引用目标对象&#xff0c;代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代…

Kubernetes对象深入学习之一:概览

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于《Kubernetes对象深入学习》系列 在client-go的学习和使用过程中&#xff0c;不可避免涉及到对象相关的代码&#xff0c;经常面临一个尴尬的现象&#x…

PCL点云处理之多角度剖面切割(一百九十五)

PCL点云处理之多角度切割点云剖面(一百九十五) 一、算法介绍二、具体实现1.沿法向量方向切割剖面2.沿竖直方向切割剖面3.沿水平方向切割剖面一、算法介绍 点云的剖面往往隐藏着很多有用信息,而且分析更加简单一些,这里自己实现一系列不同角度的点云剖面切割,包括沿着法向量…

车载软件架构 —— 闲聊几句AUTOSAR OS(七)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

Framework - AMS

一、概念 Android10&#xff08;API29&#xff09;开始&#xff0c;ActivityTaskManagerService 接管 ActivityManagerService。 二、启动ATMS过程 三、启动APP & 跳转Activity过程 3.1 Activity → ATMS 启动一个 APP 或跳转一个 Activity 都是调用的 startActivity()&a…

数据结构--串的存储结构

数据结构–串的存储结构 串的顺序存储 静态数组实现(定长顺序存储) #define MAXLEN 255 typedef struct {char ch[MAXLEN];int length; }SString;动态数组实现(堆分配存储) typedef struct {char* ch;int length; }HString;int main() {HString S;S.ch (char*)malloc(sizeo…