React(react18)中组件通信05——redux ➕ react-redux(含数据共享)

news2024/12/23 20:32:33

React(react18)中组件通信05——redux ➕ react-redux(含数据共享)

  • 1. 前言
    • 1.1 React中组件通信的其他方式
    • 1.2 介绍React-Redux
      • 1.2.1 简单介绍React-Redux
      • 1.2.2 官网
    • 1.3 安装react-redux
  • 2. 简单改写redux的例子
    • 2.1 提供store
    • 2.2 连接 Components + UI组件修改
      • 2.2.1 连接 Components
      • 2.2.2 修改UI组件
      • 2.2.3 看效果
    • 2.3 连接 Components——优化(优化容器组件)
    • 2.4 优化容器组件(可怕的精简)
    • 2.5 附代码
  • 3. 多reducer实现数据共享
    • 3.1 介绍 combineReducers()函数
    • 3.2 多reducer整合的例子
      • 3.2.1 想实现的效果
      • 3.2.2 项目目录设计结构
      • 3.2.3 将3个reducer整合(或者说拆分reducer)
      • 3.2.4 每个组件的三个核心文件
        • 3.2.4.1 简单介绍——以cat为例
        • 3.2.4.2 关于dog 和 petPark 的
    • 3.3 实现数据共享
      • 3.3.1 实现数据共享
    • 3.4 附核心代码
      • 3.4.1 两个action
      • 3.4.2 三个reducer + 一个整合reducer
      • 3.4.3 三个组件
  • 4.

1. 前言

1.1 React中组件通信的其他方式

  • React(react18)中组件通信01——props.
  • React(react18)中组件通信02——消息订阅与发布、取消订阅以及卸载组件时取消订阅.
  • React(react18)中组件通信03——简单使用 Context 深层传递参数.
  • React(react18)中组件通信04——redux入门.
    而本篇文章的代码改动是在此(redux入门)文章的基础上改动的,所以下面关于redux有疑问的还请看这篇文章。

1.2 介绍React-Redux

1.2.1 简单介绍React-Redux

  • React-Redux是Redux 官方提供的 React 绑定库。 具有高效且灵活的特性。
    • react-redux 是一个专为 React 应用开发而设计的基于 Redux 的库,提供了一些特定于 React 的功能和组件。
    • 它提供了一系列的 API 和组件,方便在 React 组件中使用 Redux 进行状态管理。
  • React-Redux 在概念上非常简单。它订阅 Redux 存储,检查组件所需的数据是否已更改,并重新渲染组件
  • react-redux 提供了一些特定于 React 的功能,如 connect 函数和 Provider 组件,用于连接 Redux 的 store,并将状态传递给 React 组件。
    • React Redux 提供的 <Provider /> 组件,这使得 Redux store 能够在应用的其他地方使用(即:store只需在入口文件传递一次,其他需要store的容器组件中都可以获取)。

1.2.2 官网

  • 参考官网:
    • 官网地址:https://react-redux.js.org/.
    • gitHub上:https://github.com/reduxjs/react-redux.
    • Redux 中文官网.
    • React Redux 中文文档.
  • 了解react-redux的其他博客:
    • React-Redux 的历史和实现.
  • 关于下面用到的connect API,去官网去官网:
    https://cn.react-redux.js.org/tutorials/connect.

1.3 安装react-redux

  • 安装命令如下:
    # If you use npm:
    npm install react-redux
    
    # Or if you use Yarn:
    yarn add react-redux
    

2. 简单改写redux的例子

  • 注意,这个改写是在redux项目版本的基础上改写的,关于redux版本的,看下面的:
    React(react18)中组件通信04——redux入门.

2.1 提供store

  • 第一步我们需要使得 store 对于我们的应用是可见的。为了做到这个,我们使用 React Redux 提供的 API <Provider /> 去包裹我们的应用。:
    • 首先先给改写后的目录结构
      在这里插入图片描述
    • 然后再看app.js 和 index.js
      在这里插入图片描述

2.2 连接 Components + UI组件修改

2.2.1 连接 Components

  • 先看官网怎么讲解的
    在这里插入图片描述

  • 先简单写写实现效果,后续再优化,如下:
    在这里插入图片描述

    import CountNumRedux from "../components/CountNumRedux";
    import { connect } from "react-redux";
    import store from '../redux/store'
    
    //这里ownProps如果用不到的话,可以不传,可以只传state
    const mapStateToProps = (state, ownProps) => ({
          // ...依据 state 和 自定义 ownProps 生成 computed data
          /**
           * 即状态统一在容器组件中管理
           * UI组件使用的话直接通过props取就行了,这种方式也相当于通过props传递
           * 如果监听state的变化,一有变化就调用,并把state通过props传递给UI组件
           */
          count:state
        //   name:'麦兜'
      });
    
      const mapDispatchToProps = ()=>({
        // ... 通常是一个充满 action creators 的 object
           addNumber:(number)=>{
               store.dispatch(
                   { type: 'INCREMENT', number:number }
               )
           },
           reduceNumber:(number)=>{
               store.dispatch(
                   { type: 'DECREMENT', number:number }
               )
           }
     });
    
      
    //   // 1. `connect` 返回一个接收要包装的组件的新函数:
    //   const connectToStore = connect(mapStateToProps, mapDispatchToProps);
    
    //   // 2. 并且该函数返回连接的,包装的组件:
    //   const ConnectedComponent = connectToStore(Component);
      
      // 通常我们会将两者一步完成,像这样:
    const CountNumContainer = connect(mapStateToProps, mapDispatchToProps)(CountNumRedux);
    
    export default CountNumContainer;
    

2.2.2 修改UI组件

  • 如下:
    在这里插入图片描述

    import {  createRef } from "react";
    // import store from '../redux/store'
    // import countAction from '../redux/countAction'
    
    function CountNumRedux(props){
        console.log(props);
    
        // const [count,setCount] = useState(0);
        const numberRef = createRef();
    
        function add(){
            let number = numberRef.current.value;
            // console.log(typeof number);  //string
            // store.dispatch(countAction.incrementNum(parseInt(number)));
            props.addNumber(parseInt(number));
        }
    
        function subtract(){
            let number = parseInt(numberRef.current.value);
            props.reduceNumber(number);
        }
    
        // useEffect(()=>{
        //     store.subscribe(()=>{
        //         console.log('订阅更新,打印2-----',store.getState());
        //         setCount(store.getState());
        //     });
        // });
    
        return(
            <div>
                {/* 当前数字是:{count}    &nbsp;&nbsp;&nbsp;&nbsp;
                当前数字是:{store.getState()}   */}
    
                当前数值是:{props.count}
                <br />
                浮动数字:<input type="number" ref={numberRef}/>
    
                <br /><br />
                <button onClick={add}>点我 加数</button> <br /><br />
                <button onClick={subtract}>点我 减数</button>
            </div>
        )
    }
    export default CountNumRedux;
    

2.2.3 看效果

  • 如下:
    在这里插入图片描述

2.3 连接 Components——优化(优化容器组件)

  • 主要优化 mapDispatchToProps,用封装好的action,如下:

    import CountNumRedux from "../components/CountNumRedux";
    import { connect } from "react-redux";
    // import store from '../redux/store'
    import {incrementNum,decrementNum} from "../redux/countAction";
    
    
    const mapStateToProps = (state) => ({
          count:state
      });
    
    
    //   const mapDispatchToProps = ()=>({
    //        addNumber:(number)=>{
    //            store.dispatch(
    //                { type: 'INCREMENT', number:number }
    //            )
    //        },
    //        reduceNumber:(number)=>{
    //            store.dispatch(
    //                { type: 'DECREMENT', number:number }
    //            )
    //        }
    //  });
    
    /**
     * 1. dispatch:react-redux 会将dispatch传入,所以不用引入store来调了
     * 2. 引入已经封装好的action:countAction
     */
     const mapDispatchToProps = (dispatch)=>({
        addNumber:(number)=>{
            dispatch( incrementNum(number) )
        },
        reduceNumber:(number)=>{
            dispatch( decrementNum(number) )
        }
    });
    
    const CountNumContainer = connect(mapStateToProps, mapDispatchToProps)(CountNumRedux);
    
    export default CountNumContainer;
    

2.4 优化容器组件(可怕的精简)

  • mapDispatchToProps: 此参数可以是一个 function,或者一个 object。
    • 上面都是用function写的,接下来换成object之后,代码真的太少了!
    • 不妨再看一下官方强调的:
      在这里插入图片描述
  • 精简代码如下:
    /**
     * 优化2
     */
    const mapDispatchToProps = {
        //通常是一个充满 action creators 的 object
        addNumber: incrementNum,   //addNumber:是通过props传递给UI组件的方法, incrementNum:是封装好的action函数
        reduceNumber: decrementNum
    }
    
    对比一下:
    在这里插入图片描述

2.5 附代码

  • 关于redux文件下的代码就不贴了,因为没改动,需要的直接上篇文章就行,其他如下:
    • CountNumContainer.jsx
      import CountNumRedux from "../components/CountNumRedux";
      import { connect } from "react-redux";
      import {incrementNum,decrementNum} from "../redux/countAction";
      
      const mapStateToProps = (state) => ({
            count:state
        });
      
      const mapDispatchToProps = {
          //通常是一个充满 action creators 的 object
          addNumber: incrementNum,   //addNumber:是通过props传递给UI组件的方法, incrementNum:是封装好的action函数
          reduceNumber: decrementNum
      }
      
      const CountNumContainer = connect(mapStateToProps, mapDispatchToProps)(CountNumRedux);
      
      export default CountNumContainer;
      
    • CountNumRedux.jsx
      import {  createRef } from "react";
      
      function CountNumRedux(props){
          console.log(props);
          
          const numberRef = createRef();
      
          function add(){
              let number = numberRef.current.value;
              props.addNumber(parseInt(number));
          }
      
          function subtract(){
              let number = parseInt(numberRef.current.value);
              props.reduceNumber(number);
          }
      
          return(
              <div>
                  {/* 当前数字是:{count}    &nbsp;&nbsp;&nbsp;&nbsp;
                  当前数字是:{store.getState()}   */}
      
                  当前数值是:{props.count}
                  <br />
                  浮动数字:<input type="number" ref={numberRef}/>
      
                  <br /><br />
                  <button onClick={add}>点我 加数</button> <br /><br />
                  <button onClick={subtract}>点我 减数</button>
              </div>
          )
      }
      export default CountNumRedux;
      
    • App.js
      import CountNumContainer from './container/CountNumContainer.jsx'
      
      function App() {
        return (
          <div>
            {/* <CountNumRedux/> */}
            <CountNumContainer/>
          </div>
        );
      }
      
      export default App;
      
    • index.js
      import React from 'react';
      import ReactDOM from 'react-dom/client';
      import App from './App';
      
      import store from './redux/store';
      import { Provider } from 'react-redux';
      
      
      const root = ReactDOM.createRoot(document.getElementById('root'));
      root.render(
          <Provider store={store}>
              <App />
          </Provider>
      );
      
      export default root;
      

3. 多reducer实现数据共享

3.1 介绍 combineReducers()函数

  • 随着应用变得越来越复杂,可以考虑将 reducer 函数 拆分成多个单独的函数,拆分后的每个函数负责独立管理 state 的一部分。

    combineReducers 辅助函数的作用是,把一个由多个不同 reducer 函数作为 value 的 object,合并成一个最终的 reducer 函数,然后就可以对这个 reducer 调用 createStore 方法。

    合并后的 reducer 可以调用各个子 reducer,并把它们返回的结果合并成一个 state 对象。 由 combineReducers() 返回的 state 对象,会将传入的每个 reducer 返回的 state 按其传递给 combineReducers() 时对应的 key 进行命名
    示例:

    rootReducer = combineReducers({potato: potatoReducer, tomato: tomatoReducer})
    // 这将返回如下的 state 对象
    {
      potato: {
        // ... potatoes, 和一些其他由 potatoReducer 管理的 state 对象 ...
      },
      tomato: {
        // ... tomatoes, 和一些其他由 tomatoReducer 管理的 state 对象,比如说 sauce 属性 ...
      }
    }
    

    在这里插入图片描述

  • 关于 combineReducers()函数 的介绍来源于官网,关于combineReducers()更多讲解,可去官网,如下:
    https://cn.redux.js.org/api/combinereducers.

3.2 多reducer整合的例子

3.2.1 想实现的效果

  • 先设计三个组件的渲染,如下:
    在这里插入图片描述
  • 这三个组件里的状态都是交给react- redux管理的,我们先实现这个无数据共享的,然后再实现怎么让组件之间可以数据共享。

3.2.2 项目目录设计结构

  • 如下:
    在这里插入图片描述

3.2.3 将3个reducer整合(或者说拆分reducer)

  • 关于reducer的拆分,可以去官网,上面介绍combineReducers()函数时也说了,这里就不多说了,也可以去官网看拆分reducer逻辑,地址如下:
    拆分 Reducer 逻辑.
  • 上面的cat、dog、pet分别对应1个reducer,但是创建store的时候只需要一个reducer,所以最终需要将这三个reducer函数合并成一个最终的reducer函数给创建store时使用。
  • 本项目中怎么使用 combineReducers() 的,你现在可以不用知道其他3个reducer长什么样,只要他们3个都暴露出了就行,所以我这里直接介绍合并,如下:
    在这里插入图片描述

3.2.4 每个组件的三个核心文件

3.2.4.1 简单介绍——以cat为例
  • 这里为了看着方便,没有抽出常量,把UI组件和容器组件整合在了一个文件里,所以上面看到的3个模块组件各对应3个核心文件:action、reducer、容器组件。
  • 下面以cat组件为例进行说明:
    • catAction + catReducer:
      猫这里只想更改“今日最受欢迎的猫品种“,所以这个相对来说是简单的,一个action函数就可以了,那么如果action设计好了,reducer也就可以完善了,如下:
      在这里插入图片描述
    • CatContainer 组件 ,如下:
      在这里插入图片描述
3.2.4.2 关于dog 和 petPark 的
  • dog的,简单直接看吧,如下:
    • dogAction + dogReducer:
      在这里插入图片描述
    • DogContainer 组件 ,如下:
      在这里插入图片描述
  • petPark的如下:
    这个比较简单点,因为这个里没有设计状态的改变,所以没有对应的action,都是初试值,如下:
    在这里插入图片描述

3.3 实现数据共享

3.3.1 实现数据共享

  • 现在在上面效果的基础上,实现数据共享,就很简单了,加两行代码的事,跟取自己的一样,如下:
    • petPark访问其他两个组件的数据:
      在这里插入图片描述
    • cat访问petPark的数据,也是一样的,想怎么访问怎么访问,因为本来就不在组件内部管理,而是react-redux在管理,谁用谁取就是了:
      在这里插入图片描述

3.4 附核心代码

3.4.1 两个action

  • catAction 如下:

    
    function changeCatKindAction(newKind){
        return {
            type: 'CHANGE_CAT_KIND',
            kind: newKind
        }
    }
    
    export {changeCatKindAction}
    
  • dogAction 如下:

    
    function addDogAction(dogObj){
        return {
            type:'ADD_DOG',
            dog:dogObj
        }
    }
    
    export {addDogAction}
    

3.4.2 三个reducer + 一个整合reducer

  • 前三个如下:

    const catKindInit = '布偶';
    
    function catReducer(state=catKindInit, action){
        switch (action.type) {
            case 'CHANGE_CAT_KIND':
                return action.kind;
            default:
                return state;
        }
    }
    
    export default catReducer;
    
    
    const dogInit = [];
    // const dogInit = [{dogName:'狗狗',dogAge:1}];
    
    function dogReducer(state = dogInit, action){
        const {type,dog} = action;
        switch (type) {
            case 'ADD_DOG':
                return [...state,dog];
            default:
                return state;
        }
    }
    
    export default dogReducer;
    
    
    const adminInit = {parkAdmin:'素素',parkAdminPhone:'176XXXXX'};
    
    function PetParkReducer(state=adminInit, action){
        return state;  //没有action,初始state不需要修改,直接返回
    }
    
    export default PetParkReducer;
    
  • 最终的如下:

    
    import catReducer from "./catsReducer";
    import dogReducer from "./dogReducer";
    import petsParkReducer from "./petsParkReducer";
    
    import { combineReducers } from "redux";
    
    /**
     * 1. 合并后的 reducer 可以调用各个子 reducer,并把它们返回的结果合并成一个 state 对象。 
     * 2. 由 combineReducers() 返回的 state 对象,
     *    会将传入的每个 reducer 返回的 state 按其传递给 combineReducers() 时对应的 key 进行命名。
     */
    const rootReducer = combineReducers({
        petParkState: petsParkReducer,
        dogState: dogReducer,
        catState: catReducer,
    });
    
    export default rootReducer;
    

3.4.3 三个组件

  • CatContainer.jsx 如下:

    import { connect } from "react-redux";
    import { useRef } from "react";
    import {changeCatKindAction} from '../redux/actions/CatAction'
    
    //1. UI组件
    function CatUI(props){
        const catKindNode = useRef();
    
        function chagePopularKind(){
            const newKind = catKindNode.current.value;
            props.changKind(newKind);
        }
    
        return(
            <div>
                <h1>我是cat组件</h1>
                今日最受欢迎的小猫品种是:{props.popularCatKind} <br/><br/>
    
                <input type="text" ref={catKindNode} placeholder="请输入今日最受欢迎的"/> &nbsp;
                <button onClick={chagePopularKind}>修改最受欢迎的小猫品种</button>
    
                <br />
                今日管理员是:{props.guanliyuan}  <br/>
                管理员:{props.guanliyuan2.parkAdmin} 
            </div>
        )
    }
    
    //2. 容器组件
    
    function mapStateToProps(state) {
        return {
            popularCatKind: state.catState,
    
            guanliyuan: state.petParkState.parkAdmin, //可以直接访问其中某个属性
            guanliyuan2: state.petParkState, //也可以直接访问整个对象
        }
    }
    
    const mapDispatchToProps = {
        changKind: changeCatKindAction
    }
    
    const CatContainer = connect(mapStateToProps,mapDispatchToProps)(CatUI);
    
    export default CatContainer;
    
  • DogContainer.jsx 如下:

    import { useRef } from "react";
    import { connect } from "react-redux"
    import { addDogAction } from "../redux/actions/DogAction";
    
    //1. 定义UI组件
    function DogUI(props){
        // console.log(props);
        const dogList = props.dogListState;//获取狗狗列表信息
    
        const dogNameRef = useRef();
        const dogAgeRef = useRef();
    
        function addParkDog(){
            const dogName = dogNameRef.current.value;
            const dogAge = dogAgeRef.current.value;
            const dogObj = {dogName:dogName,dogAge:dogAge}
            props.addOneDog(dogObj);
        }
    
        return(
            <div>
                <h1>我是dog组件</h1> <br />
                1. 狗狗园区地址:{props.dogParkAdress}    <br /><br />
                2. 
                狗狗姓名:<input type="text" ref={dogNameRef} />    <br /> &nbsp;&nbsp;&nbsp;
                狗狗年龄:<input type="number" ref={dogAgeRef}/>  &nbsp;
                <button onClick={addParkDog}>添加狗狗</button> <br /><br />
                3. 狗狗列表信息:
                <ul>
                    {
                        dogList.map((dog,index)=>(
                            <li key={index}>{dog.dogName}---{dog.dogAge}</li>)
                        )
                    }
                </ul>
            </div>
            
        )
    }
    
    //2.容器组件 并导出容器组件
    
    const mapStateToProps = (state)=>{
        /**
         * 1. 返回的是一个对象(dog组件 管理自己组件的state)
         * 2. 语法问题:当返回的是一个对象时,用一对()括起来,否则语法报错
         */
        return(
            {
                dogListState:state.dogState,
                dogParkAdress:'北京海淀区'
            }
        )
    }
    
    const mapDispatchToProps = {
        addOneDog: addDogAction
    }
    
    const DogContainer = connect(mapStateToProps,mapDispatchToProps)(DogUI);
    
    export default DogContainer;
    
  • PetParkContainer.jsx 如下:

    import { connect } from "react-redux";
    import { useState } from "react";
    
    //1. UI组件
    function PetParkUI(props){
        console.log(props);
        const [closeFlag,setCloseFlag] = useState(false);
    
        console.log(closeFlag);
        return(
            <div>
                <h1>我是PetPark组件</h1> 
                1. 管理员:{props.parkAdminInfo.parkAdmin}  <br /> &nbsp;&nbsp;
                   管理员电话:{props.parkAdminInfo.parkAdminPhone}  <br />
                2. 现有的宠物有:{JSON.stringify(props.petKinds)} <br />
                3. 雨天是否闭园:{closeFlag ? '是' : '否'}  <br /><br />
    
                今日猫猫种类王是:{props.catKindKing}  <br /><br />
                今日dog园区有多少条狗狗:{props.dogsNum}
            </div>
        )
    }
    
    //2.容器组件
    const mapStateToProps = (state)=>({
        parkAdminInfo: state.petParkState,//这个交给react-redux管理的可以共享
        petKinds: ['猫猫','狗狗'] ,//这个如果是自身组件用的,可以用useState放自身组件上
    
        //下面是数据共享的
        catKindKing: state.catState,  //直接取cat组件里的状态
        dogsNum: state.dogState.length
    
    })
    
    //connect 的两个参数都是可选的,可传可不传
    const PetParkContainer = connect(mapStateToProps)(PetParkUI);
    
    export default PetParkContainer;
    

4.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从0学习Solidity】37. 数字签名 Signature

【从0学习Solidity】37. 数字签名 Signature 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0…

提示计算机丢失msvcp140.dll怎么办,缺少msvcp140.dll一键修复

在计算机使用过程中&#xff0c;我们可能会遇到各种稀奇古怪的问题。其中&#xff0c;msvcp140.dll 文件丢失算是比较常见的一种。那么&#xff0c;究竟什么是 msvcp140.dll 文件&#xff1f;它为什么会丢失&#xff1f;我们又该如何解决这个问题呢&#xff1f;本文将围绕这些问…

向量数据库库Milvus Cloud2.3 技术选型中性能、成本、扩展性是重点

技术选型中性能、成本、扩展性是重点 对于向量数据库来说,用户最关心的莫过于性能、成本和扩展性。 Milvus 2.x 从 Day 1 开始就将扩展性作为设计的第一优先级,在众多用户环境中落地了十亿至百亿级别场景。不止如此,对于 Milvus 来说,扩展性不仅仅意味着支持百亿级别向量,…

vue指令(代码部分)

注&#xff1a;此部分为学习uni-app时接触到的vue <template><view><view>当前标题&#xff1a;{{title}}</view><view> {{num}}</view><view>{{arr[2]}}</view><view>{{obj}}</view><view>{{obj.name}}&l…

导览软件定制开发方案

随着智能手机的普及和人们对文化、旅游等方面的需求不断增加&#xff0c;导览软件市场前景广阔。本文将围绕导览软件定制开发方案展开&#xff0c;包括以下部分&#xff1a; 一、行业现状及市场需求 导览软件市场发展迅速&#xff0c;各类导览软件层出不穷。通过对市场…

价值1000的情感爆文写作prompt,助你写出10万+阅读微信爆文

原文&#xff1a;价值1000的情感爆文写作prompt&#xff0c;助你写出10万阅读微信爆文 - 知乎 是否经常看到一些自媒体晒出这样的图片&#xff1f; 或者是这样的10w的阅读文章 那么这是真实能赚钱的吗&#xff1f;还是自媒体夸大其说&#xff0c;吸引流量。 我们先简单了解什…

ElementUI之登陆+注册->饿了吗完成用户登录界面搭建,axios之get请求,axios之post请求,跨域,注册界面

饿了吗完成用户注册登录界面搭建axios之get请求axios之post请求跨域 1.饿了吗完成用户注册登录界面搭建 将端口号8080改为8081 导入依赖&#xff0c;在项目根目录使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 -g&#xff1a;将依赖下载node_glodal全局依…

网络上怎么赚点零花钱

现代物质社会中&#xff0c;我们常常会被琐碎的开销困扰。无论是衣食住行还是休闲娱乐&#xff0c;总有一些额外的花费&#xff0c;使我们不得不时常思索如何赚点零花钱。而现如今&#xff0c;随着互联网的飞速发展&#xff0c;我们有了更多的机会通过网络来实现这个目标。现在…

Centos7做回收站功能-防止误删除

Centos7做回收站功能&#xff0c;就算误删了文件&#xff0c;也可以还原回来 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.先创建一个回收站的目录&#xff08;我在/data下&#xff09; 在大磁盘的目录下创建.trash文件夹 mkdir -p /data/.trash 2.在/root/.bas…

Vue之ElementUI实现登陆及注册

目录 ​编辑 前言 一、ElementUI简介 1. 什么是ElementUI 2. 使用ElementUI的优势 3. ElementUI的应用场景 二、登陆注册前端界面开发 1. 修改端口号 2. 下载ElementUI所需的js依赖 2.1 添加Element-UI模块 2.2 导入Element-UI模块 2.3 测试Element-UI是否能用 3.编…

Nodejs基于Vue.js编程语言在线学习平台的设计与实现5y4p2

本编程语言在线学习平台是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这二者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优…

【08】FISCOBCOS一键部署【07+08即可完成一键部署,默认生成两个节点的链】

官方文档https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE/install.html#id1 一键部署 ​ 一键部署可以在 同机 快速搭建WeBASE管理台环境&#xff0c;方便用户快速体验WeBASE管理平台。 ​ 一键部署会搭建&#xff1a;节点&#xff08;FISCO-BCOS 2.0&#xff09;…

SQL数据库基础

目录 1.SQL分类 2.SQL-DDL 2.1 数据库操作 查询 创建 删除 使用某个数据库 2.2 数据表操作 创建表 查询表 修改表 3.SQL-DML(增删改) 3.1 插入 3.2 修改 3.3 删除 4.SQL-DQL(查) 4.1 基础查询 4.2 条件查询 4.3 聚合函数查询 4.4 分组查询 4.5 排序查询 …

递归法求最大公约数

如果a或b不是不是正整数&#xff0c;则函数返回-1。 主程序样例&#xff1a; 这里给出主函数及对Gcd函数的调用样例&#xff1a; #include <stdio.h> int Gcd(int a, int b); int main() { int a, b, c; scanf(“%d %d”, &a, &b); c Gcd(a,b); if (c ! -1) {…

Python实战实例代码-网络爬虫-数据分析-机器学习-图像处理

Python实战实例代码-网络爬虫-数据分析-机器学习-图像处理 Python实战实例代码1. 网络爬虫1.1 爬取网页数据1.2 爬取图片1.3 爬取动态数据&#xff08;使用Selenium&#xff09; 2. 数据分析2.1 数据清洗2.2 数据变换2.3 数据聚合 3. 机器学习3.1 线性回归3.2 随机森林3.3 K-Me…

ElementUI之登陆+注册

一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 导依赖 建立登录和注册页面 ​编辑 配置样式 编写登录页面&#xff08;Login&#xff09; 编写注册页面&#xff08;reginter&#xff09; …

结构体,联合体与位段

1.结构体的内存对齐(计算结构体的大小) 1.1 为什么需要结构体内存对齐? 原因1:平台原因 不是所有的硬件平台都能访问任意地址上的任意数据的&#xff1b;某些平台只能在某些地址处取得某些特定类型的数据&#xff0c;否则抛出硬件异常。 比如&#xff0c;当一个平台要取一个…

黑马程序员2023新版JavaWeb企业开发全流程学习笔记(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)

目录 零、Web开发一、HTML-CSS初识Web前端Web前端课程安排小结 HTML、CSS介绍HTML快速入门HTML小结VS Code开发工具基础标签 & 样式-合集&#xff08;拟新浪微博为例&#xff09;标题排版样式超链接 正文排版布局 表格、表单标签表格标签表单标签表单项 二、JavaScriptJS基…

车载软件架构 —— AUTOSAR Vector SIP包(三)

车载软件架构 —— AUTOSAR Vector SIP包(三) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在…

【计算机网络笔记四】应用层(一)DNS域名解析

因特网的域名空间是一棵倒着生长的树&#xff0c;各级域名由其上一级域名管理机构管理。 这种按等级管理的命名方法便于维护名字的唯一性&#xff0c;并且容易设计出一种高效的域名查询机制。 注意&#xff1a;域名只是个逻辑概念&#xff0c;并不代表计算机所在的物理地点 域…