• React笔记(五)hook


    一、函数组件

    1、函数组件的创建

    函数组件:使用JS的函数(或箭头函数)创建的组件称为函数组件,函数组件有如下约定

    • 函数名称必须以大写字母开头

    • 函数组件必须有返回值,返回JSX表达式

    • 渲染函数组件:用函数名作为组件标签名

    • 组件名称可以是单标签也可以是双标签

    1. export default function Hello(){
    2.    return (
    3.        <div>
    4.           Hello Function Component
    5.        div>
    6.   )
    7. }

    VSCode 中快捷键 rfc 可自动生成。

    创建完函数组件,可以将其引入到App.jsx中

    1. import './App.css'
    2. import Hello from './Hello';
    3. function App() {
    4.  return (
    5.    <div>
    6.      <Hello>Hello>
    7.    div>
    8. );
    9. }
    10. export default App;
    2、函数组件事件处理

    注意:函数组件中绑定方法不需要this

    1. export default function Hello() {
    2.    const clickEvent = () => {
    3.        console.log('2');
    4.   }
    5.    const getParams = (params) => {
    6.        console.log(params);
    7.   }
    8.    return (
    9.        <>
    10.            <button onClick={() => {
    11.                console.log('1');
    12.           }}>按钮button>
    13.            <button onClick={clickEvent}>按钮button>
    14.            <button onClick={() => getParams('3')}>传参button>
    15.        
    16.   )
    17. }
    3、函数组件的Prop
    3.1、函数组件的Props
    1. import React from 'react';
    2. import ReactDOM from 'react-dom';
    3. function LoginForm(props){
    4.    return <h1>{props.title}登录h1>;
    5. }
    6. const template=<LoginForm title='管理员'>LoginForm>
    7. ReactDOM.render(template,document.getElementById('root'));

    当然也可以自己在调用函数组件的时候指定其他的,比如下面这个例子输入会员,就会变成会员登录

    1. import React from 'react';
    2. import ReactDOM from 'react-dom';
    3. function LoginForm(props){
    4.    return <h1>{props.title}登录h1>;
    5. }
    6. const template=<LoginForm title='会员'>LoginForm>
    7. ReactDOM.render(template,document.getElementById('root'));

    下面我们再定义一个函数式组件,然后在这里边传递多个参数

    1. import React from 'react';
    2. import ReactDOM from 'react-dom';
    3. function UserInfo(props){
    4.    console.log(props);
    5.    const template=(
    6.        <div>
    7.            <ul>
    8.                <li>姓名:{props.username}li>
    9.                <li>年龄:{props.age}li>
    10.                <li>特长:{props.specialty}li>
    11.            ul>
    12.        div>
    13.   );
    14.    return template;
    15. }
    16. const template=(
    17.    <div>
    18.        <UserInfo username={'马保国'} age={56} specialty={'太极'}>UserInfo>
    19.    div>
    20. );
    21. ReactDOM.render(template,document.getElementById('root'));

    显示效果如下所示,我们通过对控制台的观察,会发现props就是传递的JS对象的值

    如上给组件赋值除了赋常量外也可以传递变量,如下所示

    1. import React from 'react';
    2. import ReactDOM from 'react-dom';
    3. function UserInfo(props){
    4.    const template=(
    5.        <div>
    6.            <ul>
    7.                <li>姓名:{props.username}li>
    8.                <li>年龄:{props.age}li>
    9.                <li>特长:{props.specialty}li>
    10.            ul>
    11.        div>
    12.   );
    13.    return template;
    14. }
    15. const u={
    16.    username:'马保国',
    17.    age:69,
    18.    specialty:'打太极'
    19. };
    20. const template=(
    21.    <div>
    22.        <UserInfo username={u.username} age={u.age} specialty={u.specialty}>UserInfo>
    23.    div>
    24. );
    25. ReactDOM.render(template,document.getElementById('root'));

    其实还有简写方式

    1. import React from 'react';
    2. import ReactDOM from 'react-dom';
    3. function UserInfo(props){
    4.    const template=(
    5.        <div>
    6.            <ul>
    7.                <li>姓名:{props.username}li>
    8.                <li>年龄:{props.age}li>
    9.                <li>特长:{props.specialty}li>
    10.            ul>
    11.        div>
    12.   );
    13.    return template;
    14. }
    15. const u={
    16.    username:'马保国',
    17.    age:69,
    18.    specialty:'打太极'
    19. };
    20. const template=(
    21.    <div>
    22.        <UserInfo {...u}>UserInfo>
    23.    div>
    24. );
    25. ReactDOM.render(template,document.getElementById('root'));
    3.2、props默认值

    首先,先来完成一个函数组件的默认值案例

    1. import React from 'react';
    2. import ReactDOM from 'react-dom';
    3. function UserInfo(props){
    4. const template=(
    5. <div>
    6. <ul>
    7. <li>姓名:{props.username}li>
    8. <li>年龄:{props.age}li>
    9. <li>特长:{props.specialty}li>
    10. ul>
    11. div>
    12. );
    13. return template;
    14. }
    15. //设置默认值的语法 组件名.defaultProps
    16. UserInfo.defaultProps={
    17. username:'无名氏',
    18. age:0,
    19. specialty:'无特长'
    20. }
    21. const template=(
    22. <div>
    23. <UserInfo username='张明理'>UserInfo>
    24. div>
    25. );
    26. ReactDOM.render(template,document.getElementById('root'));

    这里如果在调用组件的时候赋值,那么默认值就不会生效了,倘若,默认值就会生效。

    3.3、props验证器
    1. import React from 'react';
    2. import ReactDOM from 'react-dom';
    3. import PropTypes from 'prop-types';
    4. function UserInfo(props){
    5. const template=(
    6. <div>
    7. <ul>
    8. <li>姓名:{props.username}li>
    9. <li>年龄:{props.age}li>
    10. <li>特长:{props.specialty}li>
    11. ul>
    12. div>
    13. );
    14. return template;
    15. }
    16. UserInfo.propTypes={
    17. username:PropTypes.string.isRequired,
    18. age:PropTypes.number.isRequired,
    19. specialty:PropTypes.string
    20. }
    21. const template=(
    22. <div>
    23. <UserInfo age={'20岁'} specialty='打羽毛球'>UserInfo>
    24. div>
    25. );
    26. ReactDOM.render(template,document.getElementById('root'));
    4、有状态组件和无状态组件
    • 函数组件又叫做无状态组件,类组件又叫做有状态组件

    • 状态(state)即数据,是组件内部的私有数据,只能在组件内部使用

    • 函数组件没有自己的状态,只负责数据展示

    • 类组件有自己的状态,负责更新UI

    二、Hooks简介

    1、hook的由来和作用

    react16.8以后的新特性Hooks函数组件在react16.8以前函数组件只能被动接收外部数据,并且没有自己的生命周期钩子函数,函数内部也没有this可用新特性Hookhook推出的动机主要是因为类组件有一下几个不足

    • 组件之间复用公共逻辑比较麻烦,以前常见的提取组件公共逻辑的方式有高阶组件/renderProps等,但这些方式或多或少都对原有组件的代码组织方式有一定的破坏性

    • 复杂组件变得难以理解(例如相同的逻辑可能要写在不同的生命周期钩子函数里面)

    • 难以理解的class(比如对新手来见,class组件中的this不太好理解)

    新特性hook出现之后,函数组件就可以完全替代类组件,但是这并不是说react官方会抛弃类组件,react官方文档中也表明了没有计划会在react中移除class组件。

    注意:hook特性只能在函数组件中使用

    三、State Hook

    1、作用

    useState 为函数组件提供了状态(state)

    2、基本使用
    2.1、使用步骤
    • 导入useState函数

    import { useState } from 'react'
    • 调用useState函数,并传入状态的初始值,从useState函数的返回值中,拿到状态和修改状态的方法

    const [变量名, 方法名] = useState(数据初始值);
    • 在jsx中展示状态

    • 使用修改状态的方法更新状态

    2.2、代码实现
    1. import { useState } from 'react'
    2. export default function Counter() {
    3. const [count, setCount] = useState(0);
    4. const decrement = () => {
    5. setCount(count - 1)
    6. }
    7. return (
    8. <>
    9. <h1>计数器:{count}h1>
    10. <button onClick={decrement}>-1button>
    11. <button onClick={() => {setCount(count + 1)}}>+1button>
    12. )
    13. }

    注意:修改数据的 set 方法,只需要接收一个新数据作为参数,方法内部会自动用接收到的新数据来覆盖旧数据。

    3、函数作为参数
    • 语法

    const [变量名, 方法名]=useState(()=>{return '计算之后的初始值'})
    • 语法规则

      • 回调函数return出去的值作为变量名的初始值

      • 回调函数中的逻辑只会在组件初始化的时候执行一次

    • 语法选择

      • 如果初始化一个普通的数据,直接使用useState(初始值)即可

      • 如果要初始化的数据无法直接得到需要通过计算才能获取到,使用useState(()=>{})

    • 案例实现

    1. import {useState} from 'react'
    2. function Counter(props){
    3. const [count,setCount]=useState(()=>{
    4. return props.count
    5. })
    6. return(
    7. <>
    8. <h2>{count}h2>
    9. <button onClick={()=>setCount(count+1)}>+button>
    10. )
    11. }
    12. function App() {
    13. return(
    14. <>
    15. <Counter count={10}>Counter>
    16. <Counter count={20}>Counter>
    17. )
    18. }
    19. export default App;

    四、 Effect Hook

    1、作用
    • 副作用:副作用是相对与主作用而言的,一个函数除了主作用,其他作用都是副作用,对于React组件来说,主作用是根据数据(state/props)渲染UI,除此之外都是副作用

    • 常见的副作用

      • 数据请求Ajax发送

      • 手动修改DOM

      • localStorage操作

    • Effect Hook 可以让你在函数组件中执行副作用操作

    1. import {useState,useEffect} from 'react'
    2. export default function Example() {
    3. const [count,setCount]=useState(0)
    4. useEffect(()=>{
    5. document.title=`You clicked ${count} times`
    6. })
    7. return (
    8. <div>
    9. <p>You clicked {count} timesp>
    10. <button onClick={()=>{setCount(count+1)}}>Click Mebutton>
    11. div>
    12. )
    13. }
    2、useEffect 的参数
    1. import { useEffect } from 'react'
    2. useEffect(() => {}, []);

    useEffect 的参数,主要分为两个,第一个固定是一个回调函数,第二个是一个数组(可选)。

    参数传递的不同,useEffect 实现的效果也不同。

    2.1、没有第2个参数

    当 useEffect 只有第一个参数时,其作用就是在模拟 componentDidMountcomponentDidUpdate 生命周期函数。

    也就是说,useEffect 的第一个回调函数,会在组件首次挂载完成执行一次,同时,后续组件每次更新完成时也会执行。

    1. useEffect(() => {
    2. // ...
    3. })

    关键代码如下所示

    1. import {useState,useEffect} from 'react'
    2. export default function Params() {
    3. const [count,setCount]=useState(0)
    4. useEffect(()=>{
    5. console.log('没有第2个参数');
    6. })
    7. return (
    8. <div>
    9. <h1>{count}h1>
    10. <button onClick={()=>setCount(count+1)}>+1button>
    11. div>
    12. )
    13. }

    执行的效果是:组件首次挂载完成执行一次,每次单击按钮会执行一次

    2.2、第2个参数是空数组

    当 useEffect 的第二个参数是一个空数组是,其作用就是在模拟 componentDidMount 生命周期函数。

    也就是说,useEffect 的第一个回调函数,会在组件首次挂载完成执行一次。

    1. useEffect(() => {
    2. // ...
    3. }, [])

    关键代码如下所示

    1. import {useState,useEffect} from 'react'
    2. export default function Params() {
    3. const [count,setCount]=useState(0)
    4. useEffect(()=>{
    5. console.log('没有第2个参数');
    6. },[])
    7. return (
    8. <div>
    9. <h1>{count}h1>
    10. <button onClick={()=>setCount(count+1)}>+1button>
    11. div>
    12. )
    13. }

    执行的效果是:只有在组件首次挂载完成执行一次,后续单击不会执行

    2.3、第2个参数是非空数组

    当 useEffect 的第二个参数是一个非空数组时,其作用就是在模拟 componentDidMount 生命周期函数,同时还可以模拟 Vue 中 watch 的作用。

    也就是说,useEffect 的第一个回调函数,会在组件首次挂载完成执行一次。后续,只要当第二个参数的数组中,任意一条数据发生改变,useEffect 的第一个回调函数又会再次执行。

    1. useEffect(() => {
    2. // ...
    3. }, [数据1, 数据2, ...])

    关键代码如下所示

    1. import {useState,useEffect} from 'react'
    2. export default function Params() {
    3. const [count,setCount]=useState(0)
    4. const [name,setName]=useState('张三')
    5. useEffect(()=>{
    6. console.log('第2个参数是非空数字');
    7. },[count])
    8. return (
    9. <div>
    10. <h1>{count}h1>
    11. <h1>{name}h1>
    12. <button onClick={()=>setCount(count+1)}>+1button>
    13. <button onClick={()=>setName('李四')}>更新button>
    14. div>
    15. )
    16. }

    执行的结果是:在组件首次挂载完成执行一次,后续只有在点击+1操作按钮的时候才会调用useEffect的回调函数。单击更新按钮不会触发useEffect回调函数的执行

    3、清理副作用

    当 useEffect 的第一个参数中,返回了一个函数。那么,返回的这个函数就是在模拟 componentWillUnmount 生命周期函数。

    在组件被销毁时,如果有些副作用操作需要被清理,在这里可以写清理副作用的代码。

    1. useEffect(() => {
    2. return () => {
    3. }
    4. })

    关键代码

    1. import { useEffect } from 'react'
    2. export default function ClearEffect() {
    3. useEffect(() => {
    4. let times=setInterval(() => {
    5. console.log('定时执行操作');
    6. }, 1000);
    7. return ()=>{
    8. clearInterval(times)
    9. }
    10. }, [])
    11. return (
    12. <div>this is testdiv>
    13. )
    14. }
    15. ***************************************************************************************
    16. import ClearEffect from "./ClearEffect"
    17. import { useState } from "react"
    18. export default function App() {
    19. const [flag,setFlag]=useState(true)
    20. return (
    21. <div>
    22. {flag? <ClearEffect/>:null}
    23. <button onClick={()=>setFlag(!flag)}>switchbutton>
    24. div>
    25. )
    26. }
    4、useEffect-网络请求
    1. import axios from 'axios'
    2. import React, { useState, useEffect } from 'react'
    3. export default function User() {
    4. const [users, setUsers] = useState([])
    5. const getUsersApi = async () => {
    6. let result = await axios.get('http://39.106.34.185:8888/user')
    7. setUsers(result.data.data.list)
    8. }
    9. useEffect(() => {
    10. getUsersApi()
    11. }, [])
    12. return (
    13. <div>
    14. <table>
    15. <tr>
    16. <td>昵称td>
    17. <td>手机号td>
    18. <td>绑定汽车数量td>
    19. <td>订单数量td>
    20. <td>未缴费订单数量td>
    21. <td>状态td>
    22. <td>创建事件td>
    23. <td>操作td>
    24. tr>
    25. {
    26. users.map(item => <tr key={item.id}>
    27. <td>{item.name}td>
    28. <td>{item.tel}td>
    29. <td>{item.carNum}td>
    30. <td>{item.orderNum}td>
    31. <td>{item.orderNum}td>
    32. <td>{item.state==1?'启用':'禁用'}td>
    33. <td>{item.createTime}td>
    34. <td>
    35. <span>查看span>
    36. <span>订单详情span>
    37. <span>更多span>
    38. td>
    39. tr>)
    40. }
    41. table>
    42. div>
    43. )
    44. }

    五、 useRef

    1、作用

    在函数组件中获取DOM元素或者组件对象

    2、使用步骤
    • 导入useRef函数

    import { useRef } from 'react'
    • 执行useRef函数,返回一个ref对象

    1. function 组件名() {
    2. const 变量名 = useRef();
    3. }
    • 绑定 ref

    找到函数组件中对应的节点,通过 ref 属性将 ref 对象绑定到元素节点身上:

    1. function 组件名() {
    2. const 变量名 = useRef();
    3. return (
    4. <节点 ref={变量名}>
    5. )
    6. }
    • 获取元素节点

    当元素通过 ref 绑定了元素后,就可以通过 ref 对象来获取元素节点了:

    1. function 组件名() {
    2. const 变量名 = useRef();
    3. return (
    4. <节点 ref={变量名} onClick={() => {
    5. console.log(变量名.current); // 元素节点
    6. }}>
    7. )
    8. }
    3、代码实现
    1. import React,{useRef} from 'react'
    2. import './Ball.css'
    3. export default function Ball() {
    4. const ballRf=useRef()
    5. const changeBall=()=>{
    6. ballRf.current.style.backgroundColor="springgreen"
    7. }
    8. return (
    9. <div>
    10. <div className="box" ref={ballRf}>div>
    11. <button onClick={changeBall}>变化button>
    12. div>
    13. )
    14. }

    六、useMemo

    1、作用

    useMemo的作用类似vue中的计算属性computed,即根据母体数据衍生出新的数据,一旦母体数据发生变化,则useMemo会自动执行

    2、基础语法
    1. import { useMemo } from 'react'
    2. const 变量名 = useMemo(() => {
    3. return 计算得到的数据;
    4. }, [依赖的原数据])

    最终,计算得到的数据,就会通过 return 保存到变量身上。

    关键代码如下所示

    1. import {useState,useMemo} from 'react'
    2. export default function App() {
    3. const [fnum,setFnum]=useState(10)
    4. const [snum,setSnum]=useState(20)
    5. const sum=useMemo(()=>{
    6. return fnum+snum
    7. },[fnum,snum])
    8. return (
    9. <div>
    10. <h1>{sum}h1>
    11. <button onClick={()=>setFnum(fnum+2)}>fnum+2button>
    12. <button onClick={()=>setSnum(snum+3)}>snum+3button>
    13. div>
    14. )
    15. }
    3、使用hook实现购物车功能
    1. import axios from 'axios'
    2. import React, { useState, useEffect,useMemo } from 'react'
    3. import './ShopCartList.css'
    4. export default function ShopCartList() {
    5. const [list, setList] = useState([])
    6. const fetchShopCartData = async () => {
    7. const result = await
    8. axios.get('http://www.zhaijizhe.cn:3001/shopcart/getShopcartData')
    9. console.log(result.data);
    10. setList(result.data.data)
    11. }
    12. const total=useMemo(()=>{
    13. return list.filter(item=>item.checked).reduce((pre,cur)=>pre+cur.price*cur.num,0)
    14. },[list])
    15. const changeNum=async(_id,n)=>{
    16. let result=await
    17. axios.post('http://www.zhaijizhe.cn:3001/shopcart/changeNum',{_id,n})
    18. if(result.data.code){
    19. fetchShopCartData()
    20. }
    21. }
    22. const checkItem=async(_id)=>{
    23. let result=await
    24. axios.get('http://www.zhaijizhe.cn:3001/shopcart/checkProducts',{params:{_id}})
    25. if(result.data.code){
    26. fetchShopCartData()
    27. }
    28. }
    29. const changeNum1=(_id,index,n)=>{
    30. list[index].num=n
    31. setList(()=>{
    32. return[
    33. ...list
    34. ]
    35. })
    36. }
    37. const submitChangeNum=async(_id,n)=>{
    38. let result=await
    39. axios.post('http://www.zhaijizhe.cn:3001/shopcart/changeNumByInput',{_id,n})
    40. if(result.data.code){
    41. fetchShopCartData()
    42. }
    43. }
    44. useEffect(() => {
    45. fetchShopCartData()
    46. }, [])
    47. return (
    48. <div>
    49. <h1>购物车h1>
    50. <table>
    51. <thead>
    52. <tr>
    53. <th>序号th>
    54. <th>名称th>
    55. <th>价格th>
    56. <th>数量th>
    57. <th>小计th>
    58. tr>
    59. thead>
    60. <tbody>
    61. {
    62. list.map((item,index)=><tr key={item._id}>
    63. <td>
    64. <input type='checkbox'
    65. onChange={()=>checkItem(item._id)}
    66. checked={item.checked}/>
    67. td>
    68. <td>{item.name}td>
    69. <td>{item.price}td>
    70. <td>
    71. <button onClick={()=>changeNum(item._id,-1)}>-button>
    72. <input type="text" value= {item.num}
    73. onChange={(e)=>
    74. {changeNum1(item._id,index,e.target.value)}}
    75. onBlur={(e)=>
    76. {submitChangeNum(item._id,e.target.value)}}/>
    77. <button onClick={()=>changeNum(item._id,1)}>+button>
    78. td>
    79. <td>{item.price*item.num}td>
    80. tr>)
    81. }
    82. <tr>
    83. <td colSpan={5} style={{textAlign:'right'}}>
    84. 总计:{total}
    85. td>
    86. tr>
    87. tbody>
    88. table>
    89. div>
    90. )
    91. }

    七、React.memo和useCallback

    1、React.memo

    React.memo 可以用来缓存组件。

    在 React 中,默认情况下,父组件更新时,无论子组件内部是否改变,子组件也会更新。

    但是,从性能考虑,我们希望的是:父组件更新时,如果子组件内部(state 和 props)没有发生改变,子组件不用更新。

    解决方法,就是用 React.memo 将子组件缓存起来。

    1. import {useState} from 'react'
    2. import HookChild from './HookChild'
    3. export default function HookParent() {
    4. console.log('父组件');
    5. const [count,setCount]=useState(0)
    6. return (
    7. <div>
    8. <h1>父组件:{count}h1>
    9. <button onClick={()=>setCount(count+1)}>+1button>
    10. <HookChild>HookChild>
    11. div>
    12. )
    13. }
    1. import React from 'react'
    2. function HookChild() {
    3. console.log('子组件');
    4. return (
    5. <h2>子组件h2>
    6. )
    7. }
    8. export default React.memo(HookChild);
    2、useCallback

    useCallback 可以用来缓存函数。

    2.1、基础语法
    1. import { useCallback } from 'react';
    2. const 变量名 = useCallback(缓存的函数, [])
    2.2、应用场景

    通常,我们为了减少子组件不必要的更新,会使用 React.memo() 来缓存子组件的状态。

    但是,如果父组件传递了函数给子组件,那么,每次父组件更新时,函数都会重新创建。子组件中的 React.memo() 就会判定为父组件传递的内容发生了改变,那么 React.memo() 就不会缓存当前子组件的状态。

    因此,为了解决函数的问题,我们需要保存函数的状态,让父组件更新时函数能够缓存下来,因此我们需要使用 useCallback 将传递的子组件的函数状态缓存起来。

    1. import { useCallback, useState } from "react";
    2. import HookChild from "./HookChild";
    3. export default function HookFather() {
    4. console.log('父组件');
    5. const [count, setCount] = useState(0);
    6. const sayHello = () => {
    7. console.log('hello');
    8. }
    9. // 缓存函数状态
    10. const cbSayHello = useCallback(sayHello, []);
    11. return (
    12. <>
    13. <h1>父组件:{count}h1>
    14. <button onClick={() => setCount(count + 1)}>+1button>
    15. <HookChild sayHello={cbSayHello}>HookChild>
    16. )
    17. }
    1. import React from 'react'
    2. function HookChild({sayHello}) {
    3. console.log('子组件');
    4. return (
    5. <div>
    6. <h2>子组件h2>
    7. div>
    8. )
    9. }
    10. export default React.memo(HookChild)

    八、自定义hook

    自定义hook提取函数组件公共逻辑

    • 自定义hook的作用在于提取公共逻辑,所以一般不会返回一个JSX对象,而是会根据需要返回特定的数据或者方法

    • 自定义hook必须要以use开头

    假设现在有Test1和Test2两个函数组件,他们有一些公共逻辑需要提取,比如都要从后台获取一个列表数据,然后用户界面的渲染,则现在可以编写一个自定义hook来提取这部分公共逻辑,以避免重复写代码

    1. import {useState,useEffect} from 'react'
    2. export default function useData(){
    3. const [list,setList] = useState([]);
    4. useEffect(()=>{setTimeout(()=>{
    5. const list = [1,2,3]
    6. setList(list);
    7. },200);},[]);
    8. return {list,}}
    9. //Test1
    10. import useData from '...'
    11. function Test1(){
    12. const {list} = useData();
    13. return
    14. div>
    15. {...用list渲染JSX}
  • }
  • //Test2类似
  • 九、样式私有化

    在vue中可以使用scoped对组件的样式进行私有化,在React中一样,React的样式私有化也有几种处理方法

    1、内联样式

    内联样式就是在JSX元素中,直接定义行内的样式

    1. import React, { Component } from 'react'
    2. export default class Left extends Component {
    3. render() {
    4. return (
    5. <div style={{
    6. backgroundColor:'indigo',
    7. padding:20,
    8. color:'whitesmoke'
    9. }}>Leftdiv>
    10. )
    11. }
    12. }
    1. import React, { Component } from 'react'
    2. export default class Right extends Component {
    3. render() {
    4. return (
    5. <div style={{
    6. backgroundColor:'springgreen',
    7. padding:10,
    8. color:'black'
    9. }}>Rightdiv>
    10. )
    11. }
    12. }
    • 内联样式的优点

      • 使用简单:简单的以组件为中心来实现样式的添加

      • 扩展方便:通过使用对象进行样式设置,可以方便的扩展对象来扩展样式

      • 避免冲突:最终都编译为元素的行内样式,不存在样式冲突的问题

    • 内联样式的缺点

      • 不能使用伪类

      • 不能使用媒体查询

      • 减低代码的可读性

      • 没有代码提示

    2、CSS Modules

    CSS的规则都是全局的,任何一个组件的样式规则,都对整个页面有效,产生局部作用域的唯一方法,就是使用一个独一无二的class名称,这就是CSS Modules的做法,具体使用步骤如下

    • 定义xxx.module.css文件

    • 导入样式import xy from './xy.module.css'

    • 使用{xy.className}来对元素进行样式修饰

    1. import React, { Component } from 'react'
    2. import left from './left.module.css'
    3. export default class Left extends Component {
    4. render() {
    5. return (
    6. <div className={left.box}>Leftdiv>
    7. )
    8. }
    9. }
    3、React-JSS

    注意:react-jss必须使用在函数组件中

    使用步骤

    • 下载react-jss依赖包

    yarn add react-jss
    • 调用createUseStyles完成样式的定义

    1. import {createUseStyles} from 'react-jss'
    2. const useStyles=createUseStyles({
    3. box:{
    4. backgroundColor:'lightblue',
    5. padding:'10px'
    6. }
    7. })
    8. export default function Left() {
    9. const {box}=useStyles()
    10. return (
    11. <div className={box}>Rightdiv>
    12. )
    13. }
  • 相关阅读:
    优先发展非化石能源
    数据结构——线性表
    Dopamine-PEG-NH2,NH2-PEG-DOP,氨基聚乙二醇多巴胺,材料改性用科研试剂
    万字修行!消息中间件架构体系:Kafka研究,从入门到深入
    音频驱动嘴型的视频数字人虚拟主播工具motionface replay使用教程
    LeetCode刷题复盘笔记—一文搞懂0 - 1背包之494. 目标和问题(动态规划系列第九篇)
    迈向未来:Web3 技术开发的无限可能
    DOCKER本地仓库
    Selenium上传文件与webdriver_helper的用法(Web UI)
    大数据高级开发工程师——Spark学习笔记(1)
  • 原文地址:https://blog.csdn.net/m0_74343097/article/details/132644458