react相关介绍

特点

1.构建用户界面的JavaScript库
2.Facebook脸书出品
3.组件化、单向数据流、生命周期、虚拟dom、hooks等

jsx语法

jsx语法方便js中书写html模板,是JavaScript与html混合写法。简单的来说jsx就是 html与js混合写法
特点:
1.只有一个根节点
2.{}括js表达式
3.{/注释内容/}
4.classNmae定义类名
5.样式对象会自动展开
6.数组可以包含html,并自动展开

// 导入css
import './App.css'
// 定一个样式对象
var styles={
  fontSize:"48px",
  textAlign:"center",
  color:"green"
}
// 定义一个数组
var arr=[
  <h2>我是老大</h2>,
  <p>p标签</p>,
  <a href='http://www.baidu.com'>百度</a>
]
// 创建App实例
function App(){
  // 返回一段html节点
  return <div>
    <h1 className="active">你好react</h1>
    <p style={styles}>学好react,月薪过两万</p>
    {arr}
   {/*<p>{2+4}</p>
    <p>{5>10?"大于10":"他还是一个孩子"}</p>*/} 
  </div>
}
// 导出
export default App;

导入的css文件App.css

.active{
  background-color: #f70;
  color: #fff;
}

state

react组件的状态/数据
this.setState({k:新的值})
当state发生变化,引用state的视图会自动更新

react组件

函数组件、类组件
1.函数组件

function App(){
    return (
        <div>
            {/* 页面渲染 */}
        </div>
    )
}
export default App;

2.类组件

// 导入组件
import React,{Component} from "react";
// 创建一个class类
class App extends Component{
    // 类的构造函数
    constructor(props){
        // 调用父组件构造函数
        super(props);
        // 自定义 状态数据
        this.state={num:5}
    }
    // 渲染内容
    render(){
        return <div>
            <h1>App</h1>
            <p>{this.state.num}</p>
        </div>
    }
}
// 导出App组件
export default App;

函数组件与类组件的区别
1.函数组件通常展示,类组件通常作为容器。
2.类组件可以有state,函数组件没有state,管理数据用类组件。
3.函数组件没有this,类组件有this。
4.函数组件没有生命周期,类组件有生命周期。

模板语法

1.文本渲染
{}括文本内容
html文本需要加“dangerouslySetInnerHTML”才能识别标签
2.条件渲染
3.列表渲染

function App(){
    var isLog=true;
    var list=["react","vue","jQuery","angular"];
    var str1="我爱我的故乡";
    var str2= "<p>我爱<strong>我家</strong></p>"
    return (<div>
        <div>{str1}</div>
          {/* html文本渲染   __html包含两个下划线 */}
        <div dangerouslySetInnerHTML={{__html:str2}}></div>
        <h1>列表渲染</h1>
        {
            list.map(item=>(<p key={item}>{item}</p>))
        }
        <h1>模板语法-条件渲染</h1>
        {isLog&&<h3>欢迎回来</h3>}
        {isLog?<h3>欢迎回来主人</h3>:<h3>请登录</h3>}
    </div>)
}
export default App

事件

1.和原生js事件一致,事件名用驼峰式(右边为驼峰命名)
onclick onClick
onmouseover onMouseover
2.事件总是要响应一个函数

import React, { Component } from 'react';// imrc
class App extends Component { // ccc
    constructor(props) {
        super(props);
        this.state={num:5}
    }
    say=()=>{
        alert("中华文化博大精深")
    }
    doit=(msg)=>{
        alert("我爱"+msg)
    }
    add=(n=1)=>{
        // state更新必须由setState方法进行
        this.setState({num:this.state.num+n})
    }
    state = {  }
    render() { 
        return ( <div>
            <h1>更新状态state</h1>
            <button onClick={this.add.bind(this,5)}>{this.state.num}:传参5</button>
            <button onClick={()=>{this.add(2)}}>{this.state.num}:传参</button>
            <button onClick={()=>this.add()}>{this.state.num}</button>
            <h1>添加事件</h1>
            <p onClick={this.doit.bind(this,"河南")}>河南-传参</p>
            <p onClick={()=>this.doit("祖国")}>祖国-传参</p>
            <p onClick={this.say}>钓鱼岛</p>
            <p onClick={()=>alert("坐高铁去拉萨")}>风景好美</p>
            <p><button>{this.state.num}</button></p>
           </div> );
    }
}
 // this.doit.bind(this,"河南")
 // 基于doit返回一个新的函数,新函数的this是bind的第一个参数,新函数的参数是bind的第二个参数
export default App;

表单的数据绑定

import React, { Component } from 'react'
class App extends Component {
    // constructor(props) {
    //     super(props);
    // }
    state = { 
        msg:'你好react'
     }
     // 用箭头函数保障this正确性
     // 事件对象(input)对象对应的值
     updateMsg=e=>this.setState({msg:e.target.value})
    render() { 
        return ( 
            <div>
                <h1>表单数据的绑定</h1>
                <p>{this.state.msg}</p>
                {/* value与onChange都应该同时绑定 */}
                <input 
                type="text" 
                value={this.state.msg}
                onChange={this.updateMsg}
                />
            </div>
         );
    }
}
export default App;

组件

1.定义组件(组件名称的首字母必须大写)
在这里插入图片描述
2.在App.js导入组件

import Steper from './components/Steper'

3.在App.js render函数中使用

render() { 
        return ( <div>
            <Steper ></Steper><
        </div> );
    }

函数传参

1.父传子props
父组件传递

子组件接收
props.num
2.子传父,执行父组件的传递过来的props的回调函数
子传父:执行回调函数
父组件:
定义函数并把函数传递给子组件
updateSize=(n)=>this.setState({size:n})

子组件:
执行props.updateSize()
相当于执行父组件的updateSize方法
步进器
App.js

 import React,{Component} from 'react'
// 导入组件
import Steper from './components/Steper'
class App extends Component {
    state = { 
        msg:'',
        size:100,
        min:1,
        max:110,
     };
     // 父组件定义一个更新size的
    updateSize=n=>this.setState({size:n})
    render() { 
        return ( <div>
            {/* 把方法通过props方式传递给子组件 */}
            <Steper
            updateSize={this.updateSize}
            num={this.state.size}
            min={this.state.min}
            max={this.state.max}
            ></Steper><br/>
            {/* <Steper num={10}></Steper><br/>
            <Steper></Steper> */}
            <div
            style={{border:"1px solid red",
            width:this.state.size+"px",
            height:this.state.size+"px",
            }}
            >
                {this.state.size}
            </div>
        </div> );
    }
}
 
export default App;

Steper.js

import React, { Component } from 'react'
class Steper extends Component {
    constructor(props) {
        super(props);
        this.state = { 
            // count的默认值是props的num值
            count:props.num,
            mins:props.min,
            maxs:props.max
         }
    }
    // 给表单定义双向绑定
    updateCount=e=>{
        this.setState({count:e.target.value})
          // 执行父组件的updateSize方法
    this.props.updateSize(e.target.value)
    }
    render() { 
        return ( <span>
            <button 
            disabled={this.state.count<=this.state.mins}
            onClick={()=>{
                this.setState({count:this.state.count*1-1},()=>{
                    // 更新完毕,执行props.updateSize
                    this.props.updateSize(this.state.count)
                })
            }}
            >-</button>
            <input 
            type="text" 
            onChange={this.updateCount}
            value={this.state.count} />
            <button 
            disabled={this.state.count>=this.state.maxs}
            onClick={()=>{
                this.setState({count:this.state.count*1+1},()=>{
                    // 更新完毕,执行props.updateSize
                    this.props.updateSize(this.state.count)
                })
            }}
            >+</button>
             
        </span> );
    }
}
// 定义默认参数
Steper.defaultProps={
    num:1
}
export default Steper;
// 首字母要求大写

解析
在这里插入图片描述
在这里插入图片描述

组建的设计

1.容器的组件
一个页面,一个容器
有state,处理state方法
数据中心,与数据处理中心
类组件
2.视图组件
显示内容,一个视图组件
只有props没有state
函数组件

dom引用

1.导入创建dom 引用方法
import {createRef} from ‘react’
2.创建dom引用
var inp=createRef()
3.引用

4.获取值
inp.current.value
inp.current当前引用的dom节点

例:

import {createRef} from 'react';
// 创建一个dom引用
var inp=createRef();
function Item(props){
    // 勾选时候,执行组件的updateitem
    function updateItem(e){
        // 执行props的OnUpdateItem(原来的item,最新item)
        props.onUpdateItem(props.item,{...props.item,done:e.target.checked});
    }
    // 双击编辑功能
    // 确定编辑
    function sureEdit(){
        // 单击确定 更新item把状态变成1
        // 把item的title值更新inp的值
        // 更新item
        props.onUpdateItem(props.item,{...props.item,status:1,title:inp.current.value})
    }
    // 取消编辑
    function cancleEdit(){
        // 单击取消 把状态改为1,回到正常状态
        props.onUpdateItem(props.item,{...props.item,status:1})
    }
    // 去编辑
    function toEdit(){
        // 更新item 把状态改为2
        // 组件就会显示编辑状态
        props.onUpdateItem(props.item,{...props.item,status:2})
        setTimeout(()=>{
            inp.current.value=props.item.title;
        },100)
    }
    return (<div>
        {props.item.status===1?<div>
            {/* 正常状态 */}
            <input type="checkbox"  checked={props.item.done} onChange={e=>updateItem(e)} />
            <span onDoubleClick={toEdit}>{props.item.title}</span>
            {/* 单击props传递过来的onDelete方法 */}
            <button onClick={()=>props.onDelete(props.item)}>x</button>
            </div>:<div>
            {/* 编辑状态 */}
            <input ref={inp} />
            <button onClick={sureEdit}>确定</button>
            <button onClick={cancleEdit}>取消</button>
        </div>}
    </div>)
}
export default Item;
// props的数据在Item只读
// input必须绑定value和onchange绑定的 改变props
// 要是函数组件也会一个state,事件解决(hooks功能)

解构

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在一个React项目中,通常会使用一种推荐的项目结构来组织代码。这种结构包括以下几个主要文件夹和文件角色类型: 1. components(组件)文件夹:这个文件夹用于存放展示组件,也就是负责渲染页面的组件。这些组件通常只关注数据的显示和用户界面的交互,不涉及业务逻辑的处理。 2. containers(容器)文件夹:这个文件夹用于存放容器组件,也就是负责管理数据和状态的组件。这些组件通常与 Redux 状态管理密切相关,负责连接 Redux 的 state 和 action 到展示组件。 3. actions(动作)文件夹:这个文件夹用于存放 Redux 管理的各个功能模块的 actions,即定义和描述数据操作的行为。 4. reducers(状态管理)文件夹:这个文件夹用于存放 Redux 管理的各个功能模块的 reducers,即定义如何更新和管理数据的函数。 5. 其他文件:除了上述文件夹和文件之外,还可以包括一些其他的文件,比如工具函数、样式文件等。 使用这种项目结构的好处是,能够将不同角色的文件进行分类和分离,使得代码更加清晰和易于维护。当增加一个新的功能时,只需要在对应的文件夹下添加所需的组件、actions 和 reducers,不需要频繁切换和修改不同的文件。 然而,对于规模较大的项目,这种项目结构可能会变得繁琐。因此,有时候也会根据实际情况对项目结构进行调整,以适应项目的需求和规模。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [React架构整理](https://blog.csdn.net/e1172090224/article/details/125053194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [React三种经典项目架构(大神路过.....)](https://blog.csdn.net/weixin_39939012/article/details/80962190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值