Fork me on GitHub

react学习(一)(react特点,创建react项目,jsx语法,函数组件和class组件,样式写法,条件语句,遍历数组和点击事件,state和setState,表单处理)

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

React 主要用于构建 UI,很多人认为 React 是 MVC 中的 V(视图)。

React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源。

React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。

 

React 特点

  • 1.声明式设计 −React采用声明范式,可以轻松描述应用。

  • 2.高效 −React通过对DOM的模拟,最大限度地减少与DOM的交互。

  • 3.灵活 −React可以与已知的库或框架很好地配合。

  • 4.JSX − JSX 是 JavaScript 语法的扩展。React 开发不一定使用 JSX ,但我们建议使用它。

  • 5.组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。

  • 6.单向响应的数据流 − React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单。

 
创建react项目

npx create-react-app 项目名
 
引入
import React from 'react';

import ReactDOM from 'react-dom/client'; //18版本,18以前用 import ReactDOM from 'react-dom

创建react元素  渲染react元素

const title = React.createElement('h1',null,'hello react!') //18版本以前用的

const root = ReactDOM.createRoot(document.getElementById('root')); //18版本用的

ReactDOM.render(title,document.getElementById('root')) //18版本以前用的

root.render(<React.StrictMode><App /> </React.StrictMode>); //18版本用的

legacy 模式:
    ReactDOM.render(<App />, rootNode);
    // 这个模式是当前React App使用的模式,但是可能不支持某些新特性
blocking 模式:
    ReactDOM.createBlockingRoot(rootNode).render(<App />);
    // 过渡模式
concurrent 模式:
    ReactDOM.createRoot(rootNode).render(<App />);
    // 终极模式

 

JSX语法(核心)
javascript XML
就是在js里面写XML (html),通过babel转换成ReactDOM.createRoot()模式
 
函数组件和class组件两种写法
 
例子
import React from 'react';
import ReactDOM from 'react-dom';

function Hello(props) {
  return <h1>Hello World!</h1>;
}

ReactDOM.render(<Hello />, document.getElementById('root'));

 

函数组件

样式写法

import  './css/style.css'
function StyleDiv() {
    return (
        <div>
            <p style={{color:'red'}}>行内样式</p>
            <p className="title">className样式</p>
            <p className="show">显示隐藏</p>
        </div>
    )
}
export default StyleDiv

 

条件语句写法

function IfElseDiv() {
    const loading = false
    if (loading) {
        return <p>loading</p>
    } else {
        return <p>IfElseDiv</p>
    }
    // return loading?<h1>loading</h1>:<h1>IfElseDiv</h1>
}
export default IfElseDiv

遍历数组和点击事件写法

function MapDiv() {
    const list = [{ id: 1, name: 'tom' }, { id: 2, name: 'jerry' }]
    function handleClick(e){
        console.log('函数点击事件')
        console.log(e)//事件对象
    }
    return (
        <div>
            <ul>
                {list.map(item => <li key={item.id}>{item.name}</li>)}
            </ul>
            <button onClick={handleClick}>函数点击事件</button>
        </div>
    )
}
export default MapDiv

 

class组件写法
import React from "react";
class ClassExtendsDiv extends React.Component {
    handleClick(e) {
        console.log('class点击事件')
        console.log(e)//事件对象
    }
    render() {
        return (
            <div>
                <button onClick={this.handleClick}>class点击事件</button>
            </div>

        )
    }
}
export default ClassExtendsDiv

 state和setState

import React from "react";
class StateDiv extends React.Component {
    state = { count: 1 } //简化版
    // constructor() {
    //     super()
    //     this.state = {
    //         count: 1
    //     }
    // }

    //两种调用方式(this指向问题)
    //第一种
    handleClick = () => {
        this.setState({
            count: this.state.count + 1
        }, function () {
            console.log(this.state) //setState方法第二个参数为回调函数异步处理
        })
        console.log(this.state)//同步更新发现不是最新数据,因为setState异步处理
    }
    //第二种
    // handleClick() {
    //     this.setState({
    //         count: this.state.count + 1
    //     }, function () {
    //         console.log(this.state) //setState方法第二个参数为回调函数异步处理
    //     })
    //     console.log(this.state)//同步更新发现不是最新数据,因为setState异步处理
    // }
    render() {
        return (
            <div>
                计数器:{this.state.count}
                <button onClick={this.handleClick}>增加</button>
                {/* <button onClick={() => { this.handleClick() }}>增加</button> */}
            </div>
        )
    }
}
export default StateDiv

 

表单处理写法
import React from "react";
class InputDiv extends React.Component {
    state = {
        txt: '',
        id: '',
        list: [{ id: 1, name: 'tom' }, { id: 2, name: 'jerry' }],
        checked: false,
        txtRef: ''
    }
    constructor() {
        super()
        this.txtRef = React.createRef()//创建ref
    }
    // handleChange = (e) => {
    //     this.setState({
    //         txt: e.target.value
    //     })
    // }
    // selectChange = (e) => {
    //     this.setState({
    //         id: e.target.value
    //     })
    // }
    // checkedChange=(e)=>{
    //     this.setState({
    //         checked:e.target.checked
    //     })
    // }
    //变成一个事件处理表单要加name属性来判断
    formChange = (e) => {
        const target = e.target
        const value = e.target.type === 'checkbox' ? target.checked : target.value
        const name = e.target.name
        this.setState({
            [name]: value
        })
    }
    getTxt = (e) => {
        //通过ref获取值
        this.setState({
            txtRef: e.target.value
        })
        console.log('通过ref获取值', this.txtRef.current.value)
    }
    render() {
        return (
            // <div>
            //     input:
            //     <input type="text" value={this.state.txt} onChange={this.handleChange} />
            //     内容:{this.state.txt}
            //     <br />
            //     select:
            //     <select value={this.state.id} onChange={this.selectChange}>
            //         {this.state.list.map(item => <option value={item.id} key={item.id}>{item.name}</option>)}
            //     </select>
            //     <br />
            //     checkbox:
            //     <input type="checkbox" checked={this.state.checked} onChange={this.checkedChange}/>
            // </div>
            <div>
                input:
                <input type="text" name='txt' value={this.state.txt} onChange={this.formChange} />
                内容:{this.state.txt}
                <br />
                select:
                <select name='id' value={this.state.id} onChange={this.formChange}>
                    {this.state.list.map(item => <option value={item.id} key={item.id}>{item.name}</option>)}
                </select>
                <br />
                checkbox:
                <input type="checkbox" name='checked' checked={this.state.checked} onChange={this.formChange} />
                <br />
                通过ref获取值:
                <input type="text" ref={this.txtRef} value={this.state.txtRef} onChange={this.getTxt} />
            </div>
        )
    }
}
export default InputDiv

 


 
posted @ 2023-04-03 15:10  小白不白10  阅读(43)  评论(0编辑  收藏  举报