React学习

官网:

https://reactjs.org/

https://zh-hans.reactjs.org/

https://beta.reactjs.org/

3 简介

  • 声明式UI。命名式类似于函数。
  • 组件化
  • 夸平台支持比较好

4 基础环境搭建

  • 先安装 nodejs https://nodejs.org/en
  • 再下载一个简单的react项目  npx create-react-app react-basic

5 目录

核心包

    "react": "^18.2.0",
    "react-dom": "^18.2.0",

7 jsx 基础

写前端,先写html。javascript xml。比较简单,又能有js的功能。

融合了 js 和 html 的语法。

机器编译成了 js格式。

8 jsx 表达式使用

{js表达式}

const name = 'ni hao'
<h1>{name}</h1>

9 jsx 列表渲染

const songs = [
    {id: 1, name: 'A'},
    {id: 2, name: 'B'},
    {id: 3, name: 'C'},
]

function App() {
    return (
        <div className="App">
            <ul>
                {songs.map(song => <li key={song.id}>{song.name}</li>)}
            </ul>
        </div>
    );
}

export default App;

10 条件渲染

三元表达式(常用)

const flag = true
function App() {
    return (
        <div className="App">
            {flag ? <span>WN</span> : null}
        </div>
    );
}

export default App;

 

条件运算

const flag = true
function App() {
    return (
        <div className="App">
            {true && <div> no </div>}
        </div>
    );
}

export default App;

11 jsp 模板精简原则

模板中逻辑尽量精简。

复杂多分枝逻辑 收敛为一个函数 通过一个函数来写分枝逻辑 模板中负责调用

const getHtag = (x) => {
    if (x === 1) return <h1> x1</h1>
    else return <h1>x else</h1>
}
function App() {
    return (
        <div className="App">
            {getHtag(1)}
        </div>
    );
}

export default App;

12 JSP  样式控制

1)行内样式

在元素身上绑定一个style 属性即可

const style = {
    color: 'blue',
    fontSize: '30px'
}

function App() {
    return (
        <div className="App">
            <span style={style}>this is span</span>
        </div>
    );
}

export default App;

 

2)类名样式 (常用)

在元素身上绑定一个 className

import './app.css'
function App() {
    return (
        <div className="App">
            <span className='active'>this is span</span>
        </div>
    );
}

export default App;

 

13 jsx 动态类名

import './app.css'

const flag = true

function App() {
    return (
        <div className="App">
            <span className={flag ? 'active' : ''}>this is span</span>
        </div>
    );
}

export default App;

 

14 jsx 注意事项

  • jsx必须要有个根节点。
  • 所有标签必须闭合
  • jsx语法更贴近js
  • jsx支持换行,需使用()包裹,防止bug

 

15 开发工具和格式化代码

安装插件。

 

17 组件

把小功能抽离,再组装。

 

18 函数组件的创建和渲染

function Hello() {
    return <div>hello</div>
}

function App() {
    return (
        <div className="App">
            <Hello></Hello>
        </div>
    );
}

export default App;
  • 组件名称必须大写
  • 函数组件必须要有返回值

 

19 类组件的创建和渲染

import React from "react";

class HelloComponent extends React.Component {
    render() {
        return <div>This is from a class</div>
    }
}

function App() {
    return (
        <div className="App">
            <HelloComponent></HelloComponent>
        </div>
    );
}

export default App;

用法和函数组件差不多,必须 extends React.Component

 

20 事件绑定

on + 事件名称 = {事件处理程序}

import React from "react";


function Hello() {
const clickHandler = () => {
console.log('click handler')
}
return <div onClick={clickHandler}>Hello</div>
}

class HelloComponent extends React.Component {
//标准写法
clickHandler = () => {
console.log('click handler')
}

render() {
return <div onClick={this.clickHandler}>This is from a class</div>
}
}

function App() {
return (
<div className="App">
<Hello/>
<HelloComponent/>
</div>
);
}

export default App;

 

21 事件对象e

import React from "react";

class HelloComponent extends React.Component {
    //标准写法
    clickHandler = (e) => {
        e.preventDefault()
        console.log('click handler')
    }

    render() {
        return <div><a onClick={this.clickHandler} href="https://www.baidu.com">百度</a></div>
    }
}

function App() {
    return (
        <div className="App">
            <HelloComponent/>
        </div>
    );
}

export default App;

 

22 组件-事件绑定额外参数

加入事件参数e,如果不加入则删除

import React from "react";

class HelloComponent extends React.Component {
//标准写法
clickHandler = (e, msg) => {
console.log('click handler', e, msg)
}

render() {
return <div onClick={(e) => this.clickHandler(e, 'msg param')}>Hello </div>
}
}

function App() {
return (
<div className="App">
<HelloComponent/>
</div>
);
}

export default App;

 

23 组件状态

类组件状态:使用state,如果要修改使用setState

 

24 this 指向问题说明

在类中无法使用this,如果非要使用,使用bind绑定

或者使用箭头函数

 

29 组件不可变状态说明

  • 数字可以直接+1
  • 数组,拿原值,再操作
  • 对象同上

30 受控组件

input状态被React组件状态控制

  • 在组件的state声明一个组件状态数据
  • 将状态数据设置成input标签元素的value属性的值
  • 为input添加change事件
  • 通过e获取input的值
  • 调用setState更改值

31 tab切换实现

使用state状态记录一个值

 

37 组件通信

各组件数据交互就是组件通信

父子关系。最重要

 

38 父传子

  • 父组件提供数据state
  • 给自组件中添加数据的值为state中的值
  • 子组件通过props接受父组件的值 (类中使用 this.props 获取 props, 函数中用 props

39 父传子 props说明

props是单向传递,只读

props可以传递任何数据

 

40 props的解构

就是参数分开写

class 组件自身的问题

 

44 跨组件通信context

用provider 和consumer

 

60 hook

组件状态逻辑复用问题

class 问题

 

posted @ 2024-04-02 14:13  ylxn  阅读(30)  评论(0编辑  收藏  举报