React基本知识

一、React特点
(1)声明式设计:React采用声明范式,可以轻松描述应用,声明式是告诉计算机要去做什么而不管怎么做,而命令式是描述如何去做。
(2)高效:通过对Dom的模拟(虚拟dom),最大限度的减少与DOM的交互
(3)灵活:可以与已知的库或框架很好的配合
(4)JSX:是javascript语法的扩展
(5)组件:通过React构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中
(6)单向响应的数据流:这也是为什么比传统数据绑定更简单
注意:
vue:双向响应数据流用template
React:单向响应的数据流
二、函数化编程
1、柯里化函数

实现一个函数add(3)(5)结果等于8 add(1)(2)(3)(4)结果为10

    function fn(a){
        return function(b){
            return a+b;
        }
    }


     function fn(a){
        return function(b){
           return function(c){
               return a+b+c;
           }
        }
    }


2、什么是一个纯函数

输入一定输出也一定

3、声明式和命令式

    var arr = [10,20,30,40];

    for(var i=0;i<arr.length;i++){
        arr[i]+=10;
    }
//声明式
    arr.map(item=>item+10);

React必须安装的依赖

cnpm install react react-dom -S
三、在搭建的webpackproject上练习组件
(1)public->index.html

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

(2).babelrc文件中,原来的基础上加 ["@babel/preset-react"]

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "targets": {
                    "browsers": [
                        "last 2 versions"
                    ]
                }
            }
        ],
        ["@babel/preset-react"]
    ]
}

(3)在main.js中引入React

import React from "react";
import ReactDOM from "react-dom";

let url="http://www.baidu.com";
let imgUrl="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_86d58ae1.png";

//注意只用一个花括号
let dom=<div>
    <a href={url}>百度</a>
    <img src={imgUrl} className="abc"/>
    <label htmlFor="box">用户名</label>
    <input type="text" id="box"/>
</div>

ReactDOM.render(
    dom,
    document.getElementById("root"),
    ()=>{
        console.log("渲染成功")
    }
)
/*
ReactDOM.render()
    参数1:需要渲染的DOM元素或者组件
    参数2:挂载点
    参数3: 回调

*/

四、模拟 v-text、 v-html、 v-show、 v-if、 v-else、 v-bind、 v-on、 v-model、 v-for
(1) v-text

let message = "Alley"
let demo = <h2>{message}</h2>

(2)v-html

let message = <h2>Alley</h2>
let demo = <div>{message}</div>

(3) v-show
v-if
v-else

let flag = false
let demo = <div>
   {flag? <h2>111</h2>: <h2>222</h2>}
    <h2 style={{display:flag?'block':'none'}}>333</h2>
    <h2 style={{display:!flag?'block':'none'}}>444</h2>
</div>

(4)v-bind

let url = "http://www.baidu.com";
let imgUrl = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_86d58ae1.png";

let dom = <div>
    <a href={url}>百度</a>
    <img src={imgUrl}/>
</div>

(5) v-on
(6) v-model
(7) v-for

在react中不能在通过class来编写类名,只能通过className来进行编写
以及form表单中的for也不能在进行使用 而是改成htmlFor

五、ReactDOM.render()
参数1:需要渲染的DOM元素或者组件
参数2:挂载点
参数3: 回调
六、React中如何创建组件
React中通过class关键字来创建组件,React这个对象身上有一个属性Component这个Component是所有
组件的父类,如果我们想要创建组件的时候必须通过继承这个父类来创建组件

组件创建时需要注意的地方
1、组件名称必须大写
2、组件中必须有render函数,这个render函数必须返回一个JSX语法。注意的地方是只能有一个元素

render
是一个生命周期函数,render函数的作用是用来渲染jsx语法。以及虚拟DOM的对比。render函数会多次执行
只要this.state/this.props发生改不了它就会执行

react中事件的优化
1、如果在不需要传递参数的情况下,我可以将函数在constructor中提前定义,以及提前改变this指向

            constructor(){
                super();

            this.handleClick = this.handleClick.bind(this)

            }
            render(){
                return (
                    <div>
                        {
                        arr.map((item,index)=>(
                            <p key={index} onClick={this.handleClick}>{item}</p>
                        ))  
                        }
                    </div>
                )
            }

App.js中

import React from "react";
var arr=[10,20,30,40]

//创建组件的方式
class App extends React.Component{
    constructor(){
        super();
        this.handleClick=this.handleClick.bind(this)
    }
    render(){
        return(
            <div>
                {
                    arr.map((item,index)=>(
                    <p key={index} onClick={this.handleClick}>{item}</p>
                    ))
                }
            </div>
        )
    }
    handleClick(){
        console.log(this);//如果construct中没有this.handleClick=this.handleClick.bind(this),会输出undefined
    }
}
export default App;

constructor:
也是组件中的一个生命周期,如果创建组价的时候写了constructor那么就必须要书写super,
如果不写super的情况下this的指向会发生问题

    存放当前组件所需要的一些状态

    this.state = {}  状态


this.setState:
    作用是用来修改this.state中的数据,当this.setState调用了以后render函数就会重新执行。

    基本语法:
            this.setState({
                message:xxx
            })

    第二种写法
                this.setState((state)=>{
                    return {
                        message:"XXXX"
                    }
                })



    this.setState是一个异步
	this.setState的第一个参数可以是一个对象,也可以是一个函数返回一个对象,函数的参数是上一次的state
    this.setState中的第二个参数是一个回调
        作用:
            1、验证数据是否修改成功
            2、获取数据更新后最新的DOM结构
  this.setState({
        message: 1000
    },()=>{
        console.log(this.state.message);
        console.log(document.getElementById("h2").innerText)
    })
组件分类    
    1、类组件
    2、函数组件
    3、受控组件
    4、非受控组件
    5、高阶组件
    6、UI组件
    7、容器组件
    .....
    **注意:通过export方式导出,在导入时要加{ },export default则不需要**

组件状态的定义和修改

App.js中

import React from "react";


//创建组件的方式
class App extends React.Component {
    constructor() {
        super();
        //存放组件所需的一些状态
        this.state = {
            message: "1918",
            n: 0
        }
        this.handleClick=this.handleClick.bind(this);
    }
    render() {
        return (
            <div>
                <h2 id="h2">{this.state.message}</h2>
                <h2>{this.state.n}</h2>
                <button onClick={this.handleClick}>点击</button>
            </div>
        )
    }
    handleClick(){
        // this.setState({
        //     message:1000
        // },()=>{
        //     console.log(this.state.message);//输出1000
        //     console.log(document.getElementById("h2").innerText)
        // })

        this.setState((state)=>{
            return{
                message:"xxx"
            }
        })
    }
}
export default App;

super()的作用
而super( )就是将父类中的this对象继承给子类的。没有 super,子类就得不到 this 对象,没有 this 对象而要对 this 进行处理,能不报错吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值