React基础讲解

2023-11-13


前言

今天我们一起来学习react的内容,简单的学习一下。


一、React是什么?

是一个用于构建用户界面的 JavaScript 库。

二、如何使用

1.基于浏览器的模式

React.js 提供 React.js 核心功能代码,如:虚拟 dom,组件

  • React.createElement(type,props,children);

  • ReactDOM 提供了与浏览器交互的 DOM 功能,如:dom 渲染

    • ReactDOM.render(element, container[, callback])
      • element:要渲染的内容
      • container:要渲染的内容存放容器
      • callback:渲染后的回调函数

babel

babel-standalone.js:在浏览器中处理 JSX

react.development.js提供了核心代码
react-dom.development.js提供了与浏览器交互的Dom功能

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
</head>
<body>
    <div id="root"></div>

    <script>


/* 
`react.development.js 提供了核心代码
react-dom.development.js提供了与浏览器交互的Dom功能


	基础格式
	
*/
        ReactDOM.render(
            "今天天气",
            document.querySelector("#root"),
            ()=>{
                console.log("渲染成功");
            }
        );
    </script>
</body>
</html>

2.利用react 创建视图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
</head>
<body>
    <div id="root"></div>

    <script>
        let h1 = React.createElement("h1",null,"我是一个标题");
        let p = React.createElement("p",null,"我是一个段落标签");
        let el= React.createElement("header",{id:"header"},h1,p);
        ReactDOM.render(
            el,
            document.querySelector("#root"),
            ()=>{
                console.log("渲染成功");
            }
        );
    </script>
</body>
</html>

3.JSX

是一个基于 JavaScript + XML 的一个扩展语法

  • 它可以作为值使用

  • 它并不是字符串

  • 它也不是HTML

  • 它可以配合JavaScript 表达式一起使用

    不可以和js语句一起使用
    所有的标签名必须是小写
    所有标签必须闭合,哪怕单标签

    class 要写做 className
    style 接收的是一个对象,并不是字符串
    每次只能输出一个标签(或者说必须要有一个容器)
    唯一父级 唯一容器

JSX 使用注意事项

  • 必须有,且只有一个顶层的包含元素 - React.Fragment
  • JSX 不是html,很多属性在编写时不一样
    • className
    • style
  • 列表渲染时,必须有 key 值
  • 在 jsx 所有标签必须闭合
  • 组件的首字母一定大写,标签一定要小写
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
</head>

<body>
    <div id="root"></div>

    <script type="text/babel">
        /* 
         JSX :javascript 和 xml的扩展语法
         */
        ReactDOM.render(
            <header>
                <h1> hello react</h1>
                <p>利用JSX来渲染</p>
            </header>,
            document.querySelector("#root"),
            () => {
                console.log("渲染成功");
            }
        );
    </script>
</body>

</html>

4.插值表达式

在 JSX 中可以使用 {表达式} 嵌入表达式

表达式:产生值的一组代码的集合

  • 变量
  • 算术运算
  • 函数调用
  • ……

注意:分清楚 表达式 与 语句 的区别,if、for、while 这些都是语句,JSX 不支持语句

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
</head>

<body>
    <div id="root"></div>

    <script type="text/babel">

    // 各种数据的插值状态
        // let str = "天气" //原样输出
        // let str = 1; //原样输出
        // let str = false; //不输出
        // let str = undefined;//不输出
        // let str = null;//不输出
        // let str = ["内容1","内容2"];//去掉,原样输出
        let str ={

            name: "拜拜",
            age:18
        } //报错  要单独去找某个属性
        ReactDOM.render(
            <header>
                <h1>  {str.name}不错</h1>
                <p>利用JSX来渲染</p>
            </header>,
            document.querySelector("#root"),
            () => {
                console.log("渲染成功");
            }
        );
    </script>
</body>

</html>

5.条件输出

输出数据类型

  • 字符串、数字:原样输出
  • 布尔值、空、未定义 会被忽略

列表渲染

  • 数组
  • 对象
    扩展:虚拟 DOM (virtualDOM) 和 diff

条件渲染

  • 三元运算符
  • 与或运算符
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
</head>

<body>
    <div id="root"></div>

    <script type="text/babel">

    // 条件输出
        // ?: 类似 if...else
        // || 类似 if(!) 取反
        // && 类似 if()
        ReactDOM.render(
            <header>
                <h1>{true?"成立":"不成立"}</h1>
                <p>{false||"利用JSX来渲染"}</p>
                <div>{true&&"正确"}</div>
            </header>,
            document.querySelector("#root"),
            () => {
                console.log("渲染成功");
            }
        );
    </script>
</body>

</html>

6.列表循环

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/react.development.js"></script>
    <script src="js/react-dom.development.js"></script>
    <script src="js/babel.min.js"></script>
</head>

<body>
    <div id="root">

        <!-- <ul v-for="item in arr">
            <li>{{item}}</li>
        </ul> -->
    </div>

    <script type="text/babel">

        let data =[
            "内容1",
            "内容2",
            "内容3",
            "ddd"
        ]
        
        function toData(){
            let arr=[];
            data.forEach(item=>{
                return arr.push(<li>{item}</li>)
            })

            return arr;
        }
        // ReactDOM.render(
        //     <header>
        //         {toData()}
        //     </header>,
        //     document.querySelector("#root"),
        //     () => {
        //         console.log("渲染成功");
        //     }
        // );
        ReactDOM.render(
            <ul>
                {
                    data.map(item=>{
                    return<li>{item}</li>
            }) 
                }
            </ul>,
            document.querySelector("#root"),
            () => {
                console.log("渲染成功");
            }
        );
    </script>
</body>

</html>

基于自动化的集成环境模式 - create-react-app - 脚手架

通过前面 script 的方式虽然也能完成 React.js 的开发,但是有一个现在前端很重要的特性 - 模块化,无法使用。

Create React App 是一个使用 Node.js 编写的命令行工具,通过它可以帮助我们快速生成 React.js 项目,并内置了 Babel、Webpack 等工具帮助我们实现 ES6+ 解析、模块化解析打包,也就是通过它,我们可以使用 模块化 以及 ES6+ 等更新的一些特性。同时它还内置 ESLint 语法检测工具、Jest 单元测试工具。还有一个基于 Node.js 的 WebServer 帮助我们更好的在本地预览应用,其实还有更多。

安装与使用

通过 npm、yarn、npx 都可以

安装

npm

npm i -g create-react-app
yarn
yarn global add create-react-app

使用

安装完成以后,即可使用 create-react-app 命令

create-react-app <项目名称>

或者通过 npx 的方式

npx
npx create-react-app <项目名称>

项目目录结构说明

运行命令以后,就会在运行命令所在目录下面创建一个以项目名称为名的目录

my-app/
  README.md
  node_modules/
  package.json
  public/
    index.html
    favicon.ico
  src/
    App.css
    App.js
    App.test.js
    index.css
    index.js
    logo.svg

命令脚本

create-react-app 同时也提供了其它一些命令来帮助我们进行开发

npm start

启动一个内置的本地 WebServer,根目录映射到 ‘./public’ 目录,默认端口:3000

类式组件

  • 组件类必须继承 React.Component
  • 组件类必须有 render 方法

代码示例

import React,{Component} from "react";
import './FriendList.css';
import data from './data';
import Dl from './dL'
export default class Friendlist extends Component {
    render(){
        return (
            <div className="friend-list">
              {
                Object.keys(data).map(item=>{
                    return (<Dl
                        name = {item}
                        value ={data[item]}
                    />)
                })
              }
            </div>
        )
    }
}

props 和 state

  • props 父组件传递过来的参数
  • state 组件自身状态
    • setState
    • 多个 setState 合并‘
import React,{Component} from "react";

export default class Dl extends Component {


    state ={
            isOpen:true
        }
    render() {
        let {title,list} = this.props.value;
        let {isOpen} = this.state;   
        return(
            <div className={"friend-group" +(isOpen ? "expanded":"")}>
                <dt onClick={
                    ()=>{
                        this.setState({isOpen:!isOpen})
                    }
                    
                    
                }>{title}</dt>
                {
                    list.map((item,index)=>{
                        return <dd key={index}>{item.name}</dd>
                    })
                }
            </div>
        )
    }
}

props 与 state 的区别

state 的主要作用是用于组件保存、控制、修改 自己 的可变状态,在组件内部进行初始化,也可以在组件内部进行修改,但是组件外部不能修改组件的 state
props 的主要作用是让使用该组件的父组件可以传入参数来配置该组件,它是外部传进来的配置参数,组件内部无法控制也无法修改
state 和 props 都可以决定组件的外观和显示状态。通常,props 做为不变数据或者初始化数据传递给组件,可变状态使用 state

组件通信与数据流

在 React.js 中,数据是从上自下流动(传递)的,也就是一个父组件可以把它的 state / props 通过 props 传递给它的子组件,但是子组件不能修改 props - React.js 是单向数据流,如果子组件需要修改父组件状态(数据),是通过回调函数方式来完成的。

  • 父级向子级通信
  • 子级向父级通信

数据代码

let datas = {
    family:{
        title:"家人",
        list:[
            {name: "爸爸"},
            {name: "妈妈"}
        ]
    },
    friend:{
        title:"朋友",
        list:[
            {name: "张三"},
            {name: "李四"},
            {name: "王五"},

        ]
    }
}

export default datas;

React 中的事件注意问题

  • 大小写问题

onClick 必须用大写,否则会报错

<button onClick={()=>{
                this.setState({nub:nub+1})
              }}>长一岁</button>
  • this 问题

总结

今天我们主要学习了react 的一些基础内容,它包含了一些注意的地方,比如渲染时要包含的数据要用单{}去包裹。
所有标签必须闭合,哪怕单标签,这和我们之前学习的内容是一个很大的不同点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React基础讲解 的相关文章

  • React + Umi + Dva + Antd 简述 及创建项目过程简述

    React 你的第一个组件 React React是前端三大主流框架之一 你可以在React里传递多种类型的参数 如声明代码 帮助你渲染出UI 也可以是静态的HTML DOM元素 也可以传递动态变量 甚至是可交互的应用组件 安装react框
  • React重点知识拓展,含Hooks、路由懒加载等

    第7章 React扩展 一 setState 1 setState更新状态的2种写法 setState stateChange callback 对象式的setState stateChange为状态改变的对象 该对象可以体现出状态的更改
  • css in js开发利器 - styled-components(样式组件)

    styled components 是一个常见的 css in js 类库 和所有同类型的类库一样 通过 js 赋能解决了原生 css 所不具备的能力 比如变量 循环 函数等 注意 有时候 React 版本和 styled componen
  • React重新渲染的触发机制及其优化策略

    React是一个用于构建用户界面的JavaScript库 它的核心特点之一是使用虚拟DOM Virtual DOM 来实现高效的组件渲染 那组件重新渲染的机制是如何呢 基于这些机制 如果进行优化呢 虚拟DOM是一个用JavaScript对象
  • React Router 路由守卫

    React Router 路由守卫 组件内路由守卫 1 下面是使用高阶组件实现路由守卫的示例代码 import React from react import Route Redirect from react router dom con
  • 对useReducer的理解

    useReducer是React提供的一个高级Hook 它不像useEffect useState useRef等必须hook一样 没有它我们也可以正常完成需求的开发 但useReducer可以使我们的代码具有更好的可读性 可维护性 可预测
  • 如何在 Ubuntu 20.04 上使用 React 前端设置 Ruby on Rails v7 项目

    作者选择了电子前沿基金会接受捐赠作为为捐款而写程序 介绍 红宝石 on Rails是一个流行的服务器端 Web 应用程序框架 它为当今网络上存在的许多流行应用程序提供支持 例如GitHub Basecamp 声云 Airbnb and Tw
  • 配置使用Eslint的时候 版本错误 "eslint": "5.6.0" a different version of eslint was detected higher up in the tr

    1 如果你也遇到下面的问题 你可以 按照命令行提示的那样 下面这四步完成的一般就可以了 但是不排除你在运行的时候忘记下载某些依赖 1 删除 package lock json 不是package json 你可以选择 yarn lock 或
  • chrome浏览器安装redux-devtools调试工具

    chrome浏览器安装redux devtools调试工具 1 点击进入https www chromefor com 2 在搜索框搜索redux 3 找到最新版本 Redux DevTools v2 17 0 进行下载 4 选择下载线路
  • 一文揭秘饿了么跨端技术的演进、实践与落地

    本文会先带领大家一起简单回顾下跨端技术背景与演进历程与在这一波儿接着一波儿的跨端浪潮中的饿了么跨端现状 以及在这个背景下 相较于业界基于 React Vue 研发习惯出发的各种跨端方案 饿了么为什么会选择走另外一条路 这个过程中我们的一些思
  • Ant Design Pro从零到一(认识AntD)

    废话 在我们第一次接触AntD的时候 会遇到两个东西 一个是Ant Design 另一个是Ant Design Pro 他们的官网分别是 Ant Design 一套企业级 UI 设计语言和 React 组件库 Ant Design Pro
  • React之state、hooks性能分析

    目录 一 state 1 为什么使用setState 2 setState异步更新 3 如何获取异步的结果 4 setState一定是异步吗 5 源码分析 6 数据的合并 7 多个state的合并 二 为什么需要Hook 三 Class组件
  • react 上传文件(多选)功能入的坑

    1 这里报错是因为onChange的this指向不对 解决方法在constructor中写 this onChange this onChange bind this 或者在绑定事件的时候写 onChange this onChange b
  • React class组件、react-hook函数组件分别实现五子棋

    react class类组件 react hook函数组件分别实现五子棋 前言 使用create react app脚手架简单搭建 不用安装其他依赖 纯 js css实现 这里就只是简单的说明目录结构和思路 具体的代码实现请转到 Githu
  • 【React】 4课 react初识组件

    首先我们如1课创建一个文件夹在文件夹中安装react环境需要的配置文件 npm init y npm i babel standalone D npm i react react dom D 安装配置文件教程链接 https blog cs
  • 值得收藏的UmiJS 教程

    点击上方关注 前端技术江湖 一起学习 天天进步 前言 网上的umi教程是真的少 很多人都只写了一点点 很多水文 所以打算自己写一篇 自己搭建umi 并封装了一下常用的功能 并用到公司实际项目中 umi介绍 Umi 是什么 Umi 中文可发音
  • vue发展历史简介

    基本介绍 Vue 是一套用于构建用户界面的 渐进式框架 与其它大型框架不同的是 Vue 被设计为可以自底向上逐层应用 最初它不过是个人项目 时至今日 已成为全世界三大前端框架之一 github 上拥有 17 8万 Star 领先于 Reac
  • 黑马React:基础拓展

    黑马React D10 基础拓展 Date December 18 2023 useReducer 基础使用 作用 让 React 管理多个 相对关联 的状态数据 补充 和useState的作用类似 用来管理相对复杂的状态数据 特点 use
  • 如何提高React组件的渲染效率的?在React中如何避免不必要的render?

    面试官 说说你是如何提高组件的渲染效率的 在React中如何避免不必要的render 一 是什么 react 基于虚拟 DOM 和高效 Diff 算法的完美配合 实现了对 DOM 最小粒度的更新 大多数情况下 React 对 DOM 的渲染
  • 如何提高React组件的渲染效率的?在React中如何避免不必要的render?

    面试官 说说你是如何提高组件的渲染效率的 在React中如何避免不必要的render 一 是什么 react 基于虚拟 DOM 和高效 Diff 算法的完美配合 实现了对 DOM 最小粒度的更新 大多数情况下 React 对 DOM 的渲染

随机推荐

  • 分析如何计算TVS管的功率?

    常见的汽车电源部分的原理图 分别是防反接模块和LDO模块 我们的客户要求ISO7637 2脉冲5为40V 400ms 内阻2欧姆 我开始时用的SMBJ20CA 结果TVS管被烧毁 后改成SMBJ36CA 现在可以过ISO7637 2脉冲5
  • TCP通信流程解析

    B S通信简述 整个计算机网络的实现体现为协议的实现 TCP IP协议是Internet的核心协议 HTTP协议是比TCP更高层次的应用层协议 HTTP HyperText Transfer Protocol 超文本传输协议 是互联网上应用
  • java变量的种类及作用域

    1 变量 在软件系统中 是将数据存储在内存之中的 而对内存中的数据的引用就是变量 可以理解为变量就是内存中数据的代词 简单说 变量就是指代在内存中开辟的存储空间 用于存放运算过程中需要用到的数据 代码如下所示 1 int a 5 2 int
  • 机器学习第九章树回归

    文章目录 引言 9 1复杂数据的局部性建模 9 2连续和离散型特征的树的构建 9 3将CART算法用于回归 9 3 1构建树 9 4树剪枝 9 4 1预剪枝 9 4 2后剪枝 9 5模型树 9 6小结 引言 上一章的线性回归包含了一些强大的
  • 安装程序无法验证产品密钥解决方案

    加载镜像 运行sources setup exe安装
  • dwz+struts+ajax,DWZ富客户端框架(dwzjs)结合struts2的增改删查

    DWZ是实用的国产JQuery UI框架 个人感觉比较好用 他和服务器端主要通过Ajax方式交互 数据格式为json 服务器响应数据代码示例 statusCode 200 message 操 DWZ是实用的国产JQuery UI框架 个人感
  • 【雕爷学编程】Arduino动手做(65)---TCRT5000红外寻迹传感器模块3

    37款传感器与模块的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止37种的 鉴于本人手头积累了一些传感器和执行器模块 依照实践出真知 一定要动手做 的理念 以学习和交流为目的 这里准备逐一动手试试多做实验 不管成功
  • layuiAdmin后台框架以及动态权限(二)

    之前写的ssm权限系统 不再赘述 由于之前的系统是由上到下 一层层查找封装的权限数据结构 系统性能不好 和数据库会有多次交互 下面介绍第二种方式 上一篇 layuiAdmin后台框架以及动态权限 源码杂录的博客 CSDN博客 layuiad
  • KORNIA与torch 版本存在依赖关系

    KORNIA 0 58对应torch 1 7 以上对应1 8 可以多下载几个多次安装 直到支持
  • html 引入md文件,webpack将打包目录下的md、html文件解析了

    webpack 加载不加载哪个文件 与你把文件放在哪个目录无关 与你设不设置 loader也无关 webpack 打包的时候会静态代码分析 从入口文件开始 把你require import的文件打包 比如 import xx from sr
  • SPSS-线性回归

    线性回归的因变量是连续数值型变量 回归的分类见113985634 R方 变量之间是否有相关性 模型汇总表 中R表示拟合优度 值越接近1表示模型越好 但不能说他们之间不相关 可能是非线性相关 一元线性回归里 相关系数平方就是R方 多元线性回归
  • 一个交期建议程序的坑 4gl SQL

    一个交期建议程序的坑 供应表已经包含了库存 替代料 需求表依然减掉了库存替代料 select 后的sum修改之后 忘记修改having的语句 差点搞死人 防不胜防 这里用到的算法 一张供应表 一张需求表 需求表不包含库存 在验量 替代量 在
  • 数据库连接运算(join)

    联接有三种 联接和自然联接 这里是算术比较符 外联接 1 联接 从R和S的笛卡儿乘积中选取满足条件 i j 的元组 2 自然联接 naturaljoin 两个关系R和S的自然联接操作具体计算过程如下 计算R S 设R和S的公共属性是A1 A
  • elasticsearch 安装配置

    20211208 es允许远程访问 在本地启动Elasticsearch后 发现只能用localhost和127 0 0 1访问 换成电脑的ip地址 显示拒绝访问 需要修改 config elasticsearch yml下的network
  • msvcr120.dll错误的解决方法

    msvcr120 dll错误 今天本来想操作mysql的 当我把那些文件配置好准备安装mysql时 bin gt mysqld install 居然报了个msvcr120 dll错误 就去寻找这个问题解决方法 原来是在C 资源库里少了一个资
  • Acwing 2. 01背包问题

    f i j 表示从前i个物品选 总体积 lt j的所有选法中的最大值 注意 当j
  • JS设计模式

    目录 前言 单例设计模式 Command 命令模式 Constructor构造器模式 工厂模式Factory 发布订阅设计模式 publish subscribe 观察者模式 中介者模式 前言 JS设计模式是一种思想 更规范更合理的管理代码
  • R语言对苏州天气的分析及预测 温度篇

    温度篇 前面已经讲了苏州的天气特点 还是用相同的数据 做接下来的苏州气温特点的分析预测 是的预测在这里 首先看下2011年到2015年苏州整体的温度表现是什么样的 plot suzhou highestTemp type l col red
  • cherry-pick如何使用?

    多分支开发 然后从测试分支合并到生产分支 测试分支有些内容此次不上线 所以不能全量merge 此时该如何操作呢 这时候就需要使用git cherry pick 下面是阮一峰的教程http www ruanyifeng com blog 20
  • React基础讲解

    文章目录 前言 一 React是什么 二 如何使用 1 基于浏览器的模式 babel 代码如下 2 利用react 创建视图 3 JSX 4 插值表达式 代码示例 5 条件输出 输出数据类型 列表渲染 条件渲染 6 列表循环 基于自动化的集