react相关内容

一、react

1、市面上的三大框架

vue

渐进式框架

尤雨溪

设计模式:MVVM model 模型 view 试图 viewModel 试图模型(M和V之间的桥梁)

双向数据绑定

v-for v-model v-if v-show

angular

谷歌

1.x MVC model 模型 view 视图 controller控制器

2.x MVVM 微软的ts

ng-if ng-show ng-model

react

Facebook

开源

主要针对于试图

2、react介绍

react是Facebook内部的一个JavaScript类库

react用户创建web交互界面

react并不是一个完整的MVC框架,可以被认为是MVC中的V(view)

react设计思想非常独特,创新,性能出众,代码逻辑简单

react引入了虚拟DOM机制

react引入了组件化的思想

react使用了Facebook专门为它开发的一套语法糖:JSX(JavaScript XML)

3、react的优缺点

优点

  • react速度很快

  • 一切皆组件

  • 单项数据流

  • 同构、纯粹的JavaScript

  • 兼容性好

缺点

react不是一个完整的框架,它只是实现了MVC中的V,如果要构建大型的项目,那么还需要加上react-router (路由) redux(状态管理)

4、安装

脚手架

npm  i  create-react-app  -g
​
+ create-react-app@5.0.1

创建项目

create-react-app 项目名称(不能用驼峰)

5、官网

React 官方中文文档 – 用于构建用户界面的 JavaScript 库

用于构建用户界面的 JavaScript 库

6、项目目录

my-app 
├── README.md   阅读指南
├── node_modules  第三方依赖
├── package.json  项目配置文件
├── .gitignore  忽略文件
├── public   
│   ├── favicon.ico  小图标
│   ├── index.html  单页面
│   └── manifest.json  主题配置文件
└── src
    ├── App.css
    ├── App.js    主组件
    ├── index.css 
    ├── index.js  主入口文件 
    ├── logo.svg  

7、设置端口号

{
    "scripts": {
        "start": "set port=端口号 && react-scripts start"
    },
}

8、入口文件

  • src/index.js

  • 引入react库

// 1、引入react核心库
import  React from "react"
​
  • 引入reactdom库

// 2、引入react-dom 库client文件
import  ReactDOM  from "react-dom/client"

  • 创建根节点

​
// 3、创建根节点
const Root= ReactDOM.createRoot(document.getElementById("root"))

  • 渲染视图

​
// 4、渲染试图
Root.render(
    // 要渲染的内容
    <h1> 哈哈哈 </h1>
)
​

9、创建组件

9.1 函数创建组件

语法:

function  App(){
    return (
        // jsx语法   模板
    )
}
​
export default App

在src下创建主组件

src/App.js (一般主组件里面只嵌套其他组件)

function App(){
​
    return <h1>主组件</h1>
}
​
export  default App

在index.js中引入并渲染主组件

​
// 引入主组件
import  App  from "./App.jsx"
Root.render(
    // 要渲染的内容
​
    // 组件名的首字母要求大写
    <App />
)
​

9.2 类创建组件

语法:

// 引入 react
import React from "react";
​
class  Home  extends   React.Component  {
​
    render(){
        return (
            <div>
                <h1>home</h1>
            </div>
        )
    }
}
​
​
export default Home

import  {Component} from "react"
​
class App extends Component{
​
   render(){
      // render 函数时react的一个声明周期函数
​
      return (
         // 这里是jsx语法
         
      )
   }
}
​
export default App

案例:

// 引入 react
import React from "react";
import "../assets/home.css"
​
​
let navlist=["首页","分类","购物车","个人中心"]
let  active=0
​
​
​
class  Home  extends   React.Component  {
​
    render(){
        return (
            <div className="home">
                <h1>home</h1>
                <div className="nav">
                    {
                        navlist.map((item,index)=>{
                            return <div key={item} className={index==active?"active":""}>{item}</div>
                        })
                    }
                </div>
            </div>
        )
    }
}
​
​
export default Home

9.2.1 state和setState

  • state 存储数据 (不是所有的数据都需要定义到state中的)

​
constructor(){
    super()
​
    this.state={
        name:"郭伟",
        age:18
    }
}

  • setState 修改数据

    • setState函数的特点

      • setState 可以触发render的渲染

      • render函数中不可以调用setState 它会造成死循环

      • setState 是异步的,有回调函数

this.setState({
     //  重新设置数据
})
​
changeName(){
    console.log(this);//undefined  自己声明的函数是没有this的,需要通过bind  call  apply绑定this
    
    // this.state.name="韩九华"
    // react是单数据流, 修改数据之后,不会直接重新渲染页面
    
​
    // 必须手动的触发修改
    //  this.setState 可以重新触发render 
    // 所以不要把this.setState 写到render里面
    
    this.setState({
        name:"韩九华"
    })
​
}

9.3 两者区别

  • 函数组件没有state,没有声明周期

  • 类组件有state,有声明周期

10、jsx语法特点

1、js和html的混合使用
​
2、有且只能有一个根元素
​
3、{/* jsx的注释 */}
​
4、遇见<> 则解析为html语法 遇见 { } 则解析成js语法 
​
5、jsx语法中,js中的一些关键字与dom属性相同时要区分   
    class==>className  for===>htmlFor  οnclick==>onClick
​
6、jsx中的行内样式: style={ json }
​
7、jsx语法中,自闭和标签必须加结束符
​
8、在jsx语法中,  js中的 if  else  for  都不能用
​

11、数据绑定

{ 数据 }
let msg = "你好  hello  react"
let num=123
let bool=true
let arr=[1,2,3,4,5,6]
let obj={
    name:"zs",
    age:10
}
​
​
function App(){
​
    return ( <div>
        
            <h1>{msg}</h1>
            <h1>{num}</h1>
            <h1>{bool}</h1>
            <h1>{arr}</h1>
            <h1>{JSON.stringify(obj)}</h1>
            <h1>{obj.name}</h1>
            <h1>{obj.age}</h1>
        
        </div>)
}
​
​

12、动态属性绑定

属性={变量}
​
let img="https://img2.baidu.com/it/u=582136457,2836724675&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=400"
let haha="哈哈哈"
​
function App(){
​
    return  <div>
                <h1>{msg}</h1>
                <img src={img} alt=""  hehe={haha}/>
            </div>
}

13、三目运算渲染

{ 条件? 内容 : 内容    }
{ 条件? 标签 : 标签    }
let  h1 =<h1>真</h1>
let  h11=<h1>假</h1>
​
​
function App() {
​
​
    return (
​
        <div>
       
​
            { flag?"真":"假" }
​
            {
                flag? h1: h11
            }
            
        </div>
    )
}

14、列表渲染(数组绑定)

{
    数组.map((item,index)=>{
        return 循环的内容
    })
}
let  userinfo=[
    {
        id:1,
        name:"郭伟"
    },{
        id:2,
        name:"韩九华"
    },{
        id:3,
        name:"崔琳琳"
    }
]
​
<ul>
    {
        userinfo.map(item=>{
            return  <li key={item.id}>{item.name}</li>
        })
    }
</ul>

15、动态样式

动态class

className={变量}

import "./assets/app.css"
​
let arr=["数码","家具" ,"家居","服饰" , "健身"]
​
let  active=2
function App(){
    return (
        <div>
            
            <ul>
                {
                    arr.map((item,index)=> {
                        // return    <li key={item}  class="active">{item}</li>
                        // Invalid DOM property `class`. Did you mean `className`
                        // class  js中class是用来声明类的,为了解决冲突,要使用className
​
                        return    <li key={item}  className={index==active?"active":""}>{item}</li>
                    } )
                }
            </ul>
       
        </div>
    )
}

动态style

style={ json }
let  obj={
    backgroundColor:"pink",
    color:"red",
    width:"300px"
}
​
​
function App(){
    return (
        <div>
            
            {/* <h1 style={{ color:"red"}}>hello</h1> */}
            <h1 style={obj}>hello</h1>
       
        </div>
    )
}
​
export  default App
​
​
/* 
    绑定style
​
    style={ json对象  }
​
​
*/

16、组件嵌套

// 引入 组件
import 组件名  from  "组件的地址"
// 调用组件
<组件名 />

17、静态资源

import img3  from   "../assets/images/3.webp"
​
​
​
let goodslist=[
    {
        id:1,
        goodsname:"小熊饼干",
        // img:"../assets/images/1.webp"
        img:require("../assets/images/1.webp")
    },{
        id:2,
        goodsname:"我是保安",
        img:"https://img1.baidu.com/it/u=2990935198,1069729003&fm=253&fmt=auto&app=138&f=JPEG?w=667&h=500"
    },{
        id:3,
        goodsname:"保卫平安",
        img:img3
    }
]
​

18、事件

创建事件==》事件绑定==》事件传参==》事件对象==》事件传播==》各个库或者框架中的特殊方法

事件的创建和绑定

<button onClick={触发函数}>点击按钮</button>
​
<button onClick={this.fun}>点击执行fun</button>

绑定this

​
​
<button onClick={this.fun.bind(this)}>点击执行funbind</button>
​
<button onClick={ ()=>this.fun() }>点击执行fun</button>

传递参数

<button onClick={this.fun.bind(this,"李贺")}>点击执行funbind李贺</button>
​
<button onClick={ ()=>{
​
        this.fun("杨涛")
​
    } }>点击执行fun</button>
​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值