Skip to content
Go back

react_basic_practice3

React 中的组件

概念:一个组件就是用户界面的一部分,它可以有自己的逻辑和外观,组件之间可以互相嵌套,也可以复用多次

picture 0

组件化开发可以像搭积木一样构建一个应用

App 就是根组件


在React中,一个组件就是首字母大写的函数, 内部存放了组件的逻辑和视图UI,渲染组件只需要把组件当成标签写

示例如下

//  这就是一个组件
function Button() {
    // 业务逻辑,组件逻辑
    return <button>click me!</button>
}


function App() {
    return (
        <>
            <div>
                {/*   自闭和  */}
                <Button/>
                {/* 成对标签 */}
                <Button></Button>
            </div>
        </>
    )
}

箭头函数也可以,首字母大写的 function 就行

//  这就是一个组件
const Button = () => {
    // 业务逻辑,组件逻辑
    return <button>click me!</button>
}


useState

useState 是一个 React Hook 函数, 它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果

本质:和普通js不同的是,状态变量一旦发生变化,组件的视图UI也会跟着变化(数据驱动视图)

picture 1



示例代码如下

import {useState} from "react";

function App() {
    // 1.调用useState 添加一个状态变量
    // count --- 状态变量, setCount ---  修改状态变量的方法
    const [count, setCount] = useState(0)

    // 点击事件的回调函数
    const handleClick = () => {
        // 作用 ---- 用传递的 count + 1, 修改成新值, 重新使用新值渲染UI
        setCount(count + 1)
    }

    return (
        <>
            <div>
                <button onClick={handleClick}>{count}</button>
            </div>
        </>
    )
}

useState(0) --- 返回的是一个数组

picture 2



useState 修改状态的规则

在 React 中,状态被认为是只读的, 我们应该始终替换它而不是修改它,直接修改状态不能引发视图更新

let [count, setCount] = useState(0)

// 不能 count++  ---- 不能引发视图更新.

setCount(count + 1)  // 要用这种.

修改对象状态

规则:对于对象类型的状态变量,应该始终传给 set 方法一个 全新的对象 来进行修改

import {useState} from "react";

function App() {
    // 1.调用useState 添加一个状态变量
    // count --- 状态变量, setCount ---  修改状态变量的方法
    const [count, setCount] = useState(0)

    // 点击事件的回调函数
    const handleClick = () => {
        // 作用 ---- 用传递的 count + 1, 修改成新值, 重新使用新值渲染UI
        setCount(count + 1)
    }

    // 修改对象状态
    const [form, setForm] = useState({name: 'jack'})

    const changeForm = () => {
        // setForm({name: 'okkkkkkk'})
        setForm({
            ...form,   // 展开
            name: 'okkkkkkk'  // ---- 只修改 form中的 name 值
        })
    }

    return (
        <>
            <div>
                <button onClick={handleClick}>{count}</button>
                <button onClick={changeForm}>修改from{form.name}</button>
            </div>
        </>
    )
}

这个意思是: …form:将当前 form 对象中的所有属性和值都展开(拷贝)到一个新对象中。 name: ‘okkkkkkk’:在这个新对象中覆盖或设置 name 属性为 ‘okkkkkkk’。 最终得到的是一个新的对象,它和原来的 form 一样,但其中的 name 字段被更新了。

picture 3



组件基础样式控制

  1. 行内样式(不推荐)
  2. class 类名控制

示例代码如下

/*  src/index.css */

.foo {
    color: orange;
}
// 导入样式
import './index.css'

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

function App() {
    return (
        <>
            <div>
                {/*   行内样式 */}
                <span style={{color: 'red', fontSize: '50px'}}>this is span</span>
                <span style={style}>this is span</span>

                {/*    通过 class类名控制*/}
                <span className="foo">this is class foo </span>
            </div>
        </>
    )
}

picture 4




Share this post on: