React保姆级教学

React保姆级教学

    • 一、创建第一个react项目
    • 二、JSX基本语法与react基础知识
      • 1、 插值语法:
      • 2、 循环一个简单列表
      • 3、 实现简单条件渲染
      • 4、 实现复杂的条件渲染
      • 5、 事件绑定
      • 6、 基础组件(函数组件)
      • 7、 使用useState
      • 8、 基础样式控制
      • 9、 动态类名
      • 10、 操作表单,实现表单受控绑定。
      • 11、 获取DOM
      • 12、 好用的第三方库,
    • 三、组件通信
      • 1、 父传子
      • 2、 子传父
      • 3、 借助`“状态提升”`机制实现兄弟组件通信
      • 4、 使用context机制跨层传递数据
    • 四、常用钩子函数介绍
      • 4、自定义Hook函数
        • 封装通用Hook函数的通用思路
      • 5.React Hook函数的使用规则
    • 五、Redux快速上手
      • 1. 环境搭建
      • 2. store目录结构设计
      • 3. 使用流程
    • 六、ReactRouter快速上手
      • 1. 基本使用
      • 2. 导航方式
      • 3. 路由传参
      • 4. 嵌套路由
      • 5.默认二级路由
      • 6.配置未找到路由的默认展示页面,既404页面
      • 7.两种路由模式
    • 七、两个联想提示配置
    • 八、json-server 构建测试服务

一、创建第一个react项目

  1. 首先全局安装create-react-app
npm install -g create-react-app
  1. 安装好后,创建第一个react项目,注意项目名称要小写,并且不能有中文
npx create-react-app my-app
  • npx Node.js工具命令,查找并执行后续的包命令
  • create-react-app 核心包(固定写法),用于创建React项目
  • my-app React项目的名称(可以自定义)
  1. 创建好后,cd到项目目录下面,执行npm start即可
cd my-app
npm start

二、JSX基本语法与react基础知识

1、 插值语法:

JSX可以通过大括号语法{},识别JS表达式,比如变量,函数调用,方法调用等,但是只有表达式才可以。if else等语句是不可以的

// 项目的根组件

function func() {
  return '调用了函数'
}
const count = 10

function App() {
  return (
    <div className="App">
      {/* 使用引号传递字符串 */}
      {'this is App'}<br />
      {/* 使用js变量 */}
      {count}<br />
      {/* 调用函数 */}
      {func()}<br />
      {/* 方法的调用 */}
      {new Date().getDate()}<br />
      {/* 使用js对象 */}
      <div style={{ color: 'red' }}>使用了js对象</div>
    </div>
  );
}

export default App;

2、 循环一个简单列表

使用的核心方法是map

// 项目的根组件
const list = [
  { id: '1001', name: 'Vue' },
  { id: '1002', name: 'React' },
  { id: '1003', name: 'Angular' },
]
function App() {
  return (
    <div className="App">
      <ul>
        {list.map(item => <li key={item.id}>{item.name}</li>)}
      </ul>
    </div>
  );
}

export default App;

3、 实现简单条件渲染

两种方法:使用逻辑与运算符 &&或者使用三元运算符

// 项目的根组件

const isLogin = true

function App() {
  return (
    <div className="App">
      {/* 逻辑与运算符 &&  */}
      {isLogin && <span>已经登录了</span>}<br />
      {/* 三元运算符 */}
      {isLogin ? <span>已经登录了</span> : <span>用户未登录</span>}
    </div>
  );
}

export default App;

4、 实现复杂的条件渲染

通过使用自定义函数和if语句进行渲染

// 项目的根组件

const type = 1 // 0 1 3

function changeType() {
  if (type === 0) {
    return <div>我是第一种情况</div>
  } else if (type === 1) {
    return <div>我是第二种情况</div>
  } else {
    return <div>我是第三种情况</div>
  }
}

function App() {
  return (
    <div>
      {/* 通过调用函数实现条件渲染 */}
      {changeType()}
    </div>
  );
}

export default App;

5、 事件绑定

// 项目的根组件

// 普通的点击事件
const handleClick1 = () => {
  console.log('点击了button按钮')
}

// 获取点击事件的对象e
const handleClick2 = (e) => {
  console.log('点击了button按钮', e)
}

// 获取自定义参数
const handleClick3 = (name) => {
  console.log('点击了button按钮', name)
}

// 获取自定义参数,并且获取到点击事件的对象e
const handleClick4 = (name, e) => {
  console.log('点击了button按钮', name, e)
}

function App() {
  return (
    <div>
      {/* 获取自定义参数,一定要写成箭头函数的形式,否则是无法使用的 */}
      <button onClick={handleClick1}>普通的点击事件</button>
      <button onClick={handleClick2}>获取点击事件的对象e</button>
      <button onClick={() => handleClick3('xiaoming')}>获取自定义参数</button>
      <button onClick={(e) => handleClick4('xiaoming', e)}>获取自定义参数,并且获取到点击事件的对象e</button>
    </div>
  );
}

export default App;

6、 基础组件(函数组件)

首字母必须大写

// 项目的根组件

function Button() {
  return <button>this is my componment</button>
}

function App() {
  return (
    <div>
      {/* 使用组件 */}
      <Button></Button>
    </div>
  );
}

export default App;

7、 使用useState

他是一个React 的Hook(函数)。它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果
状态变量一旦发生变化,视图UI也会跟着变化(数据驱动视图)
调用useState后会返回一个数组,数组中的第一个参数是状态变量,第二个参数是set函数,用于修改状态变量。调用useState传入的参数作为状态变量的初始值

// 项目的根组件
import { useState } from 'react'

function App() {
  // 1.调用useState添加一个状态变量
  const [count, setCount] = useState(0)
  // 2.点击事件回调
  const handleClick = () => {
    setCount(count + 1)
  }
  return (
    <div>
      <button onClick={handleClick}>{count}</button>
    </div>
  );
}

export default App;

使用useState的规则
useState的状态变量是不可以进行直接的修改的,直接修改视图无法进行更新。 需要调用他的set方法对数据进行替换。

8、 基础样式控制

使用行内样式,{}大括号内部必须是一个对象的形式,并且如果使用多个单词的样式,要使用驼峰命名。例如fontSize。
使用类名的时候要注意,这里的属性名为className而不是class

// 项目的根组件
import './index.css'

function App() {
  return (
    <div>
      {/* 行内样式控制 要使用{ 样式对象 } */}
      <div style={{ color: 'red' }}>this is div</div>
      {/* 使用类名 */}
      <div className="fontColor">this is div</div>
    </div>
  );
}

export default App;

9、 动态类名

使用模板字符串,控制类名的隐藏和现实

<li className="nav-sort">
  {/* 高亮类名: active */}
  {tabs.map(item => (
    <span
      className={`nav-item ${type === item.type && 'active'}`}
      key={item.type}
      onClick={() => handleTabChange(item.type)}>
      {item.text}
    </span>
  ))}
</li>

还可以使用第三方classnames库,使用这个库以后可以将这种繁琐的拼接字符串判断类名的方式,转换为对象的形式进行拼接;增加代码可读性以及优化代码开发过程。

className={`nav-item ${type === item.type && 'active'}`}
// 转换后
className={classNames('nav-item', {active: type === item.type})}

10、 操作表单,实现表单受控绑定。

相当于数据的双向绑定,实现原理依旧是使用useState,在表单的onChange事件处调用useState的第二个参数的方法,改变

import { useState } from "react"

const App = () => {
  const [value, setValue] = useState('')

  return (
    <div>
      <input type="text" value={value} onChange={(e) => setValue(e.target.value)}></input>
    </div>
  )
}
export default App

11、 获取DOM

主要是使用useRef

import { useRef } from "react"

const App = () => {
  const inputRef = useRef(null)

  const showDom = () => {
    console.log(inputRef)
  }
  return (
    <div>
      <input type="text" ref={inputRef} />
      <button onClick={() => showDom()}>获取dom</button>
    </div>
  )
}

export default App

12、 好用的第三方库,

  • uuid,用于生成随机数。
  • dayjs,用于快速格式化日期。dayjs中文文档
  • Lodash,高性能JS工具库,它是一个一致性、模块化、高性能的 JavaScript 实用工具库。用法见官网Lodash中文文档

三、组件通信

1、 父传子

// 父传子
// 1、父组件传递数据,子组件标签身上绑定属性
// 2、子组件接收数据,props的参数
function Son(props) {
  console.log(props)
  return <div>{props.name}</div>
}

const App = () => {
  const name = 'this is app name'
  return (
    <div>
      <Son name={name}></Son>
    </div>
  )
}

export default App

子组件参数props的说明:

  • props可以传递任何类型的数据,数字、字符串、布尔、数组、对象、函数、JSX都可以进行传递;
  • props是只读的属性,既单向数据流,不允许直接修改props中的值,父组件的值只能由父组件进行修改;

(1)特殊的props:children,如果在子组件的标签包裹了其他标签,那么被包裹的内容就可以在子组件的props中多出一个children属性

function Son(props) {
  console.log(props)
}

const App = () => {
  const name = 'this is app name'
  return (
    <div>
      <Son>
        <span>this is span</span>
      </Son>
    </div>
  )
}

export default App

在这里插入图片描述

2、 子传父

主要原理是应用props的特性,可以传递任何类型;父组件定义一个函数,用于接收子组件传递的参数。然后把函数传递给子组件,让子组件调用。

// 子传父
// 父组件定义一个函数,用于接收子组件传递的参数
// 然后把函数传递给子组件,让子组件调用
function Son({ onGetSonMsg }) {
  const sonMsg = 'this is son msg'
  return (
    <div>
      this is son
      <button onClick={() => onGetSonMsg(sonMsg)}> send</button>
    </div>
  )

}

const App = () => {
  const getMsg = (msg) => {
    console.log(msg)
  }
  return (
    <div>
      <Son onGetSonMsg={getMsg} />
    </div>
  )
}

export default App

3、 借助“状态提升”机制实现兄弟组件通信

什么是状态提升?既通过共同的父组件进行数据传递

import { useState } from 'react'
// 借助状态提升机制实现兄弟组件通信

function A({ onGetAMsg }) {
  const AMsg = 'this is A msg'
  return (
    <div>
      this is A
      <button onClick={() => onGetAMsg(AMsg)}> send</button>
    </div>
  )

}

function B({ msg }) {
  return (
    <div>
      this is B{msg}
    </div>
  )
}


const App = () => {
  const [AMsg, setAMsg] = useState('')
  const getAMsg = (msg) => {
    console.log(AMsg)
    setAMsg(msg)
  }
  return (
    <div>
      <A onGetAMsg={getAMsg}></A>
      <B msg={AMsg}></B>
    </div>
  )
}

export default App

4、 使用context机制跨层传递数据

主要原理是使用createContext

import { createContext, useContext } from 'react'
// 示例,将APP里面的数据传递到B组件
// 层级关系是 <App> <A> <B></B> </A> </App>
// 1、先使用createContext创建一个上下文对象
const MsgContext = createContext()

function A() {
  return (
    <div>
      this is A
      <B></B>
    </div>
  )

}

function B() {
 // 3、在底层组件通过useContext钩子函数来使用数据
  const msg = useContext(MsgContext)
  return (
    <div>
      this is B,
      {msg}
    </div>
  )
}


const App = () => {
  const msg = 'this is app msg'
  return (
    <div>
      {/* 2、在顶层组件通过provider组件,提供数据 */}
      <MsgContext.Provider value={msg}>
        this is App
        <A/>
      </MsgContext.Provider>
    </div>
  )
}

export default App

四、常用钩子函数介绍

  1. useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作,比如发送AJAX请求,更改DOM等等。
    useEffect(() =>{}, [])
    
  • 参数1是一个函数,可以把它叫做副作用函数,在函数内部可以放置要执行的操作
  • 参数2是一个数组(可选参),在数组里放置依赖项,不同依赖项会影响第一个参数函数的执行,当是一个空数组的时候,副作用函数只会在组件渲染完毕之后执行一次
  1. useEffect的不同依赖项参数的不同执行表现
  • 1、什么也不传的情况 页面初始化以及组件更新都会调用
  • 2、传空数组 页面初始化会调用
  • 3、传一个依赖项,只有依赖项变化的时候才会调用
import { useEffect, useState } from "react"

const App = () => {
  const [count, setCount] = useState(0)
  const [sum, setSum] = useState(0)
  // 1、什么也不传的情况  页面初始化以及组件更新都会调用
  // useEffect(() => {
  //   console.log('副作用函数执行了!!')
  // })
  // 2、传空数组  页面初始化会调用
  // useEffect(() => {
  //   console.log('副作用函数执行了!!')
  // }, [])
  // 3、传一个依赖项,只有依赖项变化的时候才会调用
  useEffect(() => {
    console.log('副作用函数执行了!!')
  }, [count])
  return (
    <div>
      this is APP
      <button onClick={() => setCount(count + 1)}> count+{count}</button>
      <button onClick={() => setSum(sum + 1)}> sum+{sum}</button>
    </div>
  )
}

export default App
  1. 清除副作用,例如当我们在组件初始化的时候创建一个定时器,在组件销毁的时候要清除定时器,否则会一直占用资源。语法是在useEffect内部return一个函数,函数内部执行清除操作清除副作用做常见的时机是在组件销毁的时候
import { useState, useEffect } from "react"

function Son() {
  useEffect(() => {
    const timer = setInterval(() => {
      console.log('ding...')
    }, 1000);
    return () => {
      console.log('组件卸载,清除副作用!')
      clearInterval(timer)
    }
  }, [])
  return <div>this is son</div>
}

const App = () => {
  const [show, setShow] = useState(true)
  return (
    <div>
      {/* 模拟组件销毁 */}
      {show && <Son />}
      <button onClick={() => setShow(false)}>卸载组件</button>
    </div>
  )
}

export default App

4、自定义Hook函数

自定义Hook是以 use 打头的函数,通过自定义Hook函数可以用来实现逻辑的封装和复用

封装通用Hook函数的通用思路
  1. 生命一个以use开头的函数;
  2. 在函数体内封装可服用的逻辑;
  3. 要把组件中用到的状态或者回调return出去;
  4. 在那个组件重要用到这个逻辑,就在那里调用这个函数,结构赋值所用到的状态或者回调函数;
import { useState } from "react"

const useShowDiv = () => {
  const [show, setShow] = useState(true)
  const onChangeShow = () => {
    setShow(!show)
  }
  return {
    show,
    onChangeShow
  }
}

const App = () => {
  const { show, onChangeShow } = useShowDiv()
  // const [show, setShow] = useState(true)
  // const onChangeShow = () => {
  //   setShow(!show)
  // }
  return (
    <div>
      {show && <div>this is div</div>}
      <button onClick={() => onChangeShow()}>切换div状态</button>
    </div>
  )
}

export default App

5.React Hook函数的使用规则

  • 只能在组件中或者其他自定义Hook函数中调用
  • 只能在组件的顶层调用,不能嵌套在if、for、其他函数中
    以上两种情况,不符合条件时候开发工具和浏览器会报错,注意一下即可。

五、Redux快速上手

1. 环境搭建

在React中使用redux,官方要求安装俩个其他插件-ReduxToolkit和react-redux

  1. Redux Toolkit(RTK)-官方推荐编写Redux逻辑的方式,是一套工具的集合集,简化书写方式
  • 简化store的配置方式
  • 内置immer支持可变式状态修改
  • 内置thunk更好的异步创建
  1. react-redux-用来 链接 Redux和 React组件 的中间件
    安装插件
npm i @reduxjs/toolkit react-redux

2. store目录结构设计

在这里插入图片描述

3. 使用流程

ReduxToolkit和react-redux搭配使用流程
以一个异步请求为例

// 先引入createSlice方法
import { createSlice } from "@reduxjs/toolkit"
import axios from 'axios'
// 创建store
const foodsStore = createSlice({
	// 名称
    name: 'foods',
    initialState: {
    	// 设置初始值为空数组
        foodsList: []
    },
    reducers: {
    // 声明同步操作函数 action
        setFoodsList(state, action) {
            state.foodsList = action.payload
        }
    }
})
// 获取创建的action
const { setFoodsList } = foodsStore.actions
// 创建异步方法,异步方法的语法必须return一个方法,方法的第一个参数为dispach。
// 可用于提交action。在异步方法里面调用网络请求,将请求后的得到的数据调用同步
// 方法赋值给store
const fetchFoodsList = () => {
    return async (dispatch) => {
        const res = await axios.get('http://localhost:3004/takeaway')
        // 调用dispatch函数
        dispatch(setFoodsList(res.data))
        console.log(res)
    }
}
// 导出异步方法让外界调用
export { fetchFoodsList }

const reducer = foodsStore.reducer
// 导出reducer
export default reducer

然后在store目录下的index.js文件中,收集modules下创建的store

import foodsReducer from './modules/takeaway'
import { configureStore } from '@reduxjs/toolkit'

const store = configureStore({
    reducer: {
        foods: foodsReducer
    }
})

export default store

首次使用需要在index.js里面注入store

import React from 'react'
import { createRoot } from 'react-dom/client'

import App from './App'

import { Provider } from 'react-redux'
import store from './store'
const root = createRoot(document.getElementById('root'))
root.render(
  <Provider store={store}>
    <App />
  </Provider>
)

使用store中的数据,需要在组件内调用useSelector方法

  const {foodsList} = useSelector(state => state.foods)

六、ReactRouter快速上手

1. 基本使用

  1. 创建router目录以及index.js配置文件,通过createBrowserRouter创建router,并导出router
import Article from '../page/Article'
import Login from '../page/Login'

import { createBrowserRouter } from 'react-router-dom'

const router = createBrowserRouter([
    {
        path: '/login',
        Component: Login
    },
    {
        path: '/article',
        Component: Article
    }
])

export default router
  1. 在index.js引入路由组件RouterProvider,以及创建好的router,把router注入到路由组件中
import { RouterProvider } from 'react-router-dom'
import router from './router'

<React.StrictMode>
   <RouterProvider router={router}></RouterProvider>
</React.StrictMode>

2. 导航方式

  • 声明式写法:以组件的形式进行跳转,react-router-dom提供了一个< Link /> 组件
<Link to="/login">跳转到登录</Link>
  • 编程式写法:以代码的形式跳转
import { useNavigate } from 'react-router-dom'

const navigate = useNavigate()
navigat('/login')

3. 路由传参

  • searchParmas方式
import { useNavigate } from 'react-router-dom'

const navigate = useNavigate()
// 直接用?在url后面,各个参数用&拼接
navigat('/login?id=1001&name=jack')
// 使用useSearchParams接收
import { useSearchParams } from 'react-router-dom'
// useSearchParams 返回一个数组
const [params] = useSearchParams()
const id = params.get('id')
const name = params.get('name')
  • params方式,很像vue里面的动态路由,简直一模一样
import { useNavigate } from 'react-router-dom'

const navigate = useNavigate()
// 直接拼接在url后面,多个参数就一直往后面拼接
navigat('/login/1001/jack')

    {
        path: '/login/:id/:name',
        Component: Login
    }
import { useParams } from 'react-router-dom'
const params = useParams()
const id = params.id
const name = params.name

4. 嵌套路由

  1. 使用children配置嵌套路由
  2. 在需要嵌套路由的地方使用组件<Outlet />组件
{
    path: '/article',
    Component: Article,
    children: [
        {
            path: '/component1',
            element: <Component1/>
        },
        {
            path: '/component2',
            element: <Component2/>
        },
    ]
},

5.默认二级路由

去掉二级路由中的path,换成index并设置为true就行了

{
    path: '/article',
    Component: Article,
    children: [
        {
            index: true,
            element: <Component1/>
        },
        {
            path: '/component2',
            element: <Component2/>
        },
    ]
},

6.配置未找到路由的默认展示页面,既404页面

    {
        path: '*',
        element: <NotFound/>
    },

7.两种路由模式

以上的案例都是使用的history模式,需要后端支持。

  • history模式创建的router是使用createBrowserRouter;
  • hash模式创建的router是使用createHashRouter,url上会拼接一个#;

七、两个联想提示配置

  • 路径中使用@匹配src,要使用craco插件,因为cra既create-react-app把配置包在黑盒里面,无法直接配置。所以需要使用craco插件进行配置;
npm i -d @craco/craco

下载插件后新建craco.config.js文件,进行如下配置

const path = require("path")

module.exports = {
    webpack: {
        alias: {
            '@': path.resolve(__dirname, 'src')
        }
    }
}
  • @符号路径的联想功能
    新建jsconfig.json文件
{
    "compilerOptions": {
        "baseUrl": "./",
        "paths": {
            "@/*": [
                "src/*"
            ]
        }
    }
}

这里也一定要修改package.json文件,修改启动指令


  "scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

八、json-server 构建测试服务

  1. 安装json-server,npm i -D json-server
  2. 新建一个json文件存储数据;
  3. 在package.json添加启动命令;追加"server": "json-server ./server/data.json --port 8888"
"scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "server": "json-server ./server/data.json --port 8888"
  },

文章内容为黑马程序员课程学习总结,大家感兴趣的也可以去B站看哦,老师讲的非常好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/696167.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ui自动化中,selenium进行元素定位,以及CSS,xpath定位总结

几种定位方式 简单代码 from selenium import webdriver import time# 创建浏览器驱动对象 from selenium.webdriver.common.by import Bydriver webdriver.Chrome() # 参数写浏览器驱动文件的路径&#xff0c;若配置到环境变量就不用写了 # 访问网址 driver.get…

JDBC简介以及快速入门

这些都是JDBC提供的API 简介 每一个数据库的底层细节都不一样 不可能用一套代码操作所有数据库 我们通过JDBC可以操作所有的数据库 JDBC是一套接口 我们自己定义了实现类 定义实现类 然后就能用Java操作自己的数据库了 MySQL对于JDBC的实现类 就是驱动 快速入门 创建新的项…

冯喜运:6.10周一黄金还会再次拉升吗?日内黄金原油操作策略

【黄金消息面分析】&#xff1a;周一(6月10日)亚市盘中&#xff0c;现货黄金交在上周五暴跌后仍然承压&#xff0c;目前金价位于2294美元/盎司左右。因强劲非农数据刺激美元大涨&#xff0c;现货黄金上周五出现暴跌。此外&#xff0c;上周五数据显示&#xff0c;最大黄金消费国…

Duck Bro的第512天创作纪念日

Tips&#xff1a;发布的文章将会展示至 里程碑专区 &#xff0c;也可以在 专区 内查看其他创作者的纪念日文章 我的创作纪念日第512天 文章目录 我的创作纪念日第512天一、与CSDN平台的相遇1. 为什么在CSDN这个平台进行创作&#xff1f;2. 创作这些文章是为了赚钱吗&#xff1f…

基于运动控制卡的圆柱坐标机械臂设计

1 方案简介 介绍一种基于运动控制卡制作一款scara圆柱坐标的机械臂设计方案&#xff0c;该方案控制器用运动控制卡制作一台三轴机械臂&#xff0c;用于自动抓取和放料操作。 2 组成部分 该机械臂的组成部分有研华运动控制卡&#xff0c;触摸屏&#xff0c;三轴圆柱坐标的平面运…

MySQL时间和日期类型详解(零基础入门篇)

目录 1. DATE 2. DATETIME 3. TIMESTAMP 4. TIME 5. YEAR 6. 日期和时间的使用示例 以下SQL语句的测试可以使用命令行&#xff0c;或是使用SQL工具比如MySQL Workbench或SQLynx等。 在 MySQL 中&#xff0c;时间和日期数据类型用于存储与时间相关的数据&#xff0c;如何…

【西瓜书】大题

1.线性回归 思路&#xff1a;ywxb&#xff0c;w为一维数组&#xff0c;求均方误差MSE&#xff0c;对w和b分别求偏导为0得到关于w和b的闭式求解。预测第十年的代入ywxb求解即可。 2.查准率、查全率 思路&#xff1a;先计算每个算法测试结果的混淆矩阵&#xff0c;再根据混淆矩阵…

C语言最终讲:预处理详解

C语言最终讲&#xff1a;预处理详解 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏和函数的对比6.1宏的优势6.1.1\符号 6.2宏的劣势 7.#和##7.1#运算符7.2##运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1本地…

OpenAI 推出适用于 .NET 的 OpenAI 库

OpenAI 推出适用于 .NET 的 OpenAI 库 微软最近宣布推出面向.NET开发人员的官方OpenAI库&#xff0c;该库支持OpenAI的全套API和最新的GPT-4o旗舰模型。这个模型可以实时进行音频、视觉和文本推理。 OpenAI .NET API库 目前&#xff0c;微软已经发布了OpenAI .NET API库的第一…

树二叉树

树 ​ 树是 n&#xff08;n≥0&#xff09;个结点的有限集。当 n 0时&#xff0c;称为空树。在任意一颗非空树中应满足&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根的结点。 &#xff08;2&#xff09;当 n > 1时&#xff0c;其余结点可分为 m&…

bitset用法

参考:https://blog.csdn.net/weixin_45697774/article/details/105563993 题目:https://leetcode.cn/problems/maximum-total-reward-using-operations-ii/description/ class Solution { public:int maxTotalReward(vector<int>& rewardValues) {bitset<10000…

未卸载干净的proteus安装教程7.8

提醒&#xff1a; 针对第一次安装推荐博文&#xff1a;https://jingyan.baidu.com/article/656db918f8590de381249cbf.html 1、一定要以管理员身份运行软件。 2、以管理员身份运行软件后&#xff0c;默认的ISIS Professional路径是C:\Program Files \Labcenter Electronics\…

写给大数据开发,如何去掌握数据分析

这篇文章源于自己一个大数据开发&#xff0c;天天要做分析的事情&#xff0c;发现数据分析实在高大上很多&#xff0c;写代码和做汇报可真比不了。。。。 文章目录 1. 引言2. 数据分析的重要性2.1 技能对比2.2 业务理解的差距 3. 提升数据分析能力的方向4. 数据分析的系统过程4…

初识springclould到生产者消费者的RPC通信

SpringClould SpringBoot和SpringClould搭建springcloud创建项目管理实体类模块服务提供者模块消费者 Eureka 服务注册与发现 SpringBoot和SpringClould springboot和springclould都是spring系列的衍生品&#xff0c;都可以在spring的官网找到对应的参考文档和学习路线以及核心…

PHP“well”运动健身APP-计算机毕业设计源码87702

【摘要】 随着互联网的趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己的信息推广出去&#xff0c;最好方式就是建立自己的平台信息&#xff0c;并对其进行管理&#xff0c;随着现在智能手机的普及&#xff0c;人们对于智能手机里面的应用“well”运动健身app也在不断…

安装systemd-bootchart

要安装systemd-bootchart&#xff0c;你可以按照以下步骤进行&#xff1a; 步骤一&#xff1a;更新软件包列表 首先&#xff0c;打开终端并更新你的软件包列表&#xff0c;以确保你拥有最新的可用软件包信息。运行以下命令&#xff1a; sudo apt update步骤二&#xff1a;安…

Python 连接 MySQL 及 SQL增删改查(主要使用sqlalchemy)

目录 一、环境 二、MySQL的连接和使用 2.1方式一&#xff1a;sql为主 2.1.1创建连接 2.1.2 表结构 2.1.3 新增数据 ​编辑 2.1.4 查看数据 ​编辑 2.1.5 修改数据 2.1.6 删除数据 2.2方式二&#xff1a;orm对象关系映射 2.2.1 mysql连接 2.2.2 创建表 2.2.3 新增…

ORA-01652 表空间不够解决方案

前章&#xff1a;出现表空间不足不要手动强制删除对应数据文件存储目录下的DBF文件&#xff0c;需要用SQL语句进行数据文件的DROP&#xff0c;否则会导致ORA-01033报错&#xff0c;因为我没有开启数据库的归档所以不能通过RECOVER的形式找回数据文件最后只能重装本地ORACLE。 …

大模型如何通过token进行推理?

大型模型通过token进行推理的过程通常涉及以下步骤&#xff1a; 1、Tokenization&#xff08;分词&#xff09;&#xff1a;首先&#xff0c;输入文本或序列被分割成tokens&#xff0c;这些tokens通常是单词、子词或字符的序列。这一步通常由预训练模型的tokenizers完成。 2、…

转型AI产品经理(7):“格式塔原则”如何应用在Chatbot产品中

格式塔原则&#xff0c;又称为完形原则&#xff0c;它是一组关于人类如何感知视觉元素的心理学理论&#xff0c;这些原则说明了大脑如何将分散的视觉元素整合为有意义的整体&#xff0c;即使这些元素本身可能是分离的&#xff0c;帮助我们理解人们如何组织和解释复杂的视觉信息…