当前位置: 首页 > news >正文

08_React redux

React redux

  • 一、理解
    • 1、学习文档
    • 2、redux 是什么吗
    • 3、什么情况下需要使用 redux
    • 4、redux 工作流程
    • 5、react-redux 模型图
  • 二、redux 的三个核心概念
    • 1、action
    • 2、reducer
    • 3、store
  • 三、redux 的核心 API
    • 1、getState()
    • 2、dispatch()
  • 四、使用 redux 编写应用
    • 1、求和案例\_redux 精简版
      • 1.1 去除 Count 组件自身的状态
      • 1.2 src 下建立
      • 1.3 store.js
      • 1.4 count_reducer.js
      • 1.5 在 index.js 中检测 store 中状态的改变,一旦发生改变重新渲染
    • 2、求和案例\_redux 完整版
    • 3、求和案例\_redux 异步 action 版
    • 4、求和案例\_react-redux 基本使用
      • 4.1 明确两个概念
      • 4.2 如何创建一个容器组件—— react-redux 的 connect 函数
      • 4.3 备注 1:容器组件中的 store 是靠 props 传递的,而不是容器组件中直接引入 store
      • 4.4 备注 2:mapDispatchToProps 也可以是一个对象
    • 5、求和案例\_react-redux 优化
    • 6、多组件共享数据\_redux 管理
    • 7、纯函数
    • 8、Redux 开发者工具 redux-devtool
  • 五、项目打包运行

一、理解

1、学习文档

1、英文文档:https://redux.js.org/
2、中文文档:http://www.redux.org.cn/

2、redux 是什么吗

1、redux 是一个专门用于做状态管理的 JS 库(不是 react 插件库)
2、它可以用在 react、angular、vue 等项目中,但基本与 react 配合使用
3、作用:集中式管理 react 应用中多个组件共享的状态

3、什么情况下需要使用 redux

1、某个组件的状态,需要让其他组件可以随时拿到(共享)
2、一个组件需要改变另一个组件的状态(通信)
3、总体原则:能不用就不用,如果不用比较吃力才考虑使用

4、redux 工作流程

将公共的数据给到 redux,

5、react-redux 模型图

1、所有的 UI 组件都应该包裹一个容器组件,他们是父子关系。
2、容器组件时真正和 redux 打交道的,里面可以随意的使用 redux 的 api
3、UI 组件中不能使用任何 redux 的 api
4、容器组件会传给 UI 组件:
(1)redux 中所保存的状态
(2)用于操作状态的方法
5、备注:容器给 UI 传递:状态(这里的状态是 redux 中的状态)、操作状态的方法,均通过 props 传递

二、redux 的三个核心概念

1、action

1、动作的对象
2、包含 2 个属性:
type: 标识属性,值为字符串,唯一,必要属性
data: 数据属性,值类型任意,可选属性
3、例子:

{type:'ADD_STUDENT',data:{name: 'Tom', age:18}}

action
如果是 Object 的一般对象就是 同步 action
如果值是 function 的对象就是 异步 action

2、reducer

1、用于初始化状态、加工状态
2、加工时,根据旧的 state 和 action,产生新的 state 的纯函数

3、store

1、将 state、action、reducer 联系在一起的对象
2、如何得到此对象?
1)import {createStore} from “redux”
2)import reducer from “./reducer”
3)const store = createStore(reducer)
3、此对象的功能?
1) getState():得到 state
2)dispatch(action):分发 action,触发 reducer 调用,产生新的 state
3)subscribe(listener):注册监听,当产生了新的 state 时,自动调用

三、redux 的核心 API

1、getState()

获取状态

2、dispatch()

分发

四、使用 redux 编写应用

求和应用
展示求和,进行 加、减、结果为奇数加、异步加 运算

1、求和案例_redux 精简版

1.1 去除 Count 组件自身的状态

1.2 src 下建立

-redux
-store.js
-count_reducer.js

1.3 store.js

1.3.1 引入 redux 中的 createStore 函数,创建一个 store
1.3.2 createStore 调用时要传入一个为其服务的 reducer
1.3.3 记得暴露 store 对象

1.4 count_reducer.js

1.4.1 reducer 的本质是一个函数,接收:preState,action ,返回加工后的状态
1.4.2 reducer 有两个作用:初始化状态,加工状态
1.4.3 reducer 被第一次调用时,是 store 自动触发的:
传递的 preState 是 undefined
传递的 action 是 {type: ‘@@redux/INITn.j.9.n.r.k’}

1.5 在 index.js 中检测 store 中状态的改变,一旦发生改变重新渲染

备注:redux 只负责管理状态,至于状态的改变驱动着页面的展示,要靠我们自己写

2、求和案例_redux 完整版

新增文件
1、count_action.js 专门用于 创建 action 对象
2、constant.js 放置由于编码疏忽写错 action 中的 type

3、求和案例_redux 异步 action 版

1、明确:延迟的动作不想交给组件自身,想交给 action
2、何时需要异步 action:想要状态进行操作,但是具体的数据靠异步任务返回(非必须)
3、具体编码:
3.1 yarn add redux-thunk, 并配置在 store 中
3.2 创建 action 的函数不再返回一般对象,而是一个函数,该函数中写异步任务
3.3 异步任务有结果后,分发一个同步的 action 去真正操作数据
4、备注:异步 action 不是必须要写的,完全可以自己等待异步任务的结果返回了再去分发同步 action

4、求和案例_react-redux 基本使用

4.1 明确两个概念

1、UI 组件:不能使用任何 redux 的 api,只负责页面的呈现、交互等
2、容器组件:负责和 redux 同学呢,将结果交给 UI 组件

4.2 如何创建一个容器组件—— react-redux 的 connect 函数

connect(mapStateToProps,mapDisapatchToProps)(UI 组件)
mapStateToProps: 映射状态,返回值是一个对象
mapDisapatchToProps:映射操作状态的方法,返回值是一个对象

容器组件的写法:

// 容器组件 react-redux// 引入Count 的 UI 组件
import CountUI from '../../components/Count'
// 引入 action
import {createIncrementAction,createDecrementAction,createIncrementAsyncAction,
} from '../../redux/count_action'// 引入 connect 用于连接 UI 组件与 redux
import { connect } from 'react-redux'/*** 1、mapStateToProps 函数返回的是一个对象;* 2、返回的对象中的 key 就作为传递给 UI 组件 props 的key, value就作为传递给 UI 组件 props 的value* 3、mapStateToProps 用于传递状态*/
// mapStateToProps 函数的返回值作为状态传递给了 UI 组件
// 返回的对象中的 key 就作为传递给 UI 组件 props 的key, value就作为传递给 UI 组件 props 的value -- 状态
const mapStateToProps = (state) => {return {count: state,}
}// mapDisapatchToProps 函数返回的对象中的 key 就作为传递给 UI 组件 props 的key, value就作为传递给 UI 组件 props 的value -- 操作状态的方法
const mapDisapatchToProps = (dispatch) => {return {jia: (data) => {// 通知 redux 执行加法dispatch(createIncrementAction(data))},jian: (data) => {// 通知 redux 执行加法dispatch(createDecrementAction(data))},jiaAsync: (data) => {// 通知 redux 执行加法dispatch(createIncrementAsyncAction(data, 500))},}
}// 使用 connect()() 创建并暴露一个 Count 的容器组件
export default connect(mapStateToProps, mapDisapatchToProps)(CountUI)

UI 组件的写法:

import React, { Component } from 'react'
export default class CountUI extends Component {// 加法increment = () => {const { value } = this.selectNothis.props.jia(value * 1)}// 减法decrement = () => {const { value } = this.selectNothis.props.jian(value * 1)}// 当前求和为奇数再加incrementIfOdd = () => {let { count } = this.propsif (count % 2 !== 0) {this.increment()}}//异步加incrementAsync = () => {const { value } = this.selectNothis.props.jiaAsync(value * 1)}render() {console.log('props--->', this.props)return (<div><h1>当前求和为:{this.props.count}</h1><selectref={(c) => {this.selectNo = c}}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select>&nbsp;&nbsp;<button onClick={this.increment}>加</button> &nbsp;&nbsp;<button onClick={this.decrement}>减</button>&nbsp;&nbsp;<button onClick={this.incrementIfOdd}>当前求和为奇数再加</button>&nbsp;&nbsp;<button onClick={this.incrementAsync}>异步加</button></div>)}
}

4.3 备注 1:容器组件中的 store 是靠 props 传递的,而不是容器组件中直接引入 store

4.4 备注 2:mapDispatchToProps 也可以是一个对象

react-redux 会将 action 进行分发,不再需要自己调用 dispatch

容器组件(自带监测功能)的优化写法:

// 容器组件 react-redux// 引入Count 的 UI 组件
import CountUI from '../../components/Count'
// 引入 action
import {createIncrementAction,createDecrementAction,createIncrementAsyncAction,
} from '../../redux/count_action'// 引入 connect 用于连接 UI 组件与 redux
import { connect } from 'react-redux'// 使用 connect()() 创建并暴露一个 Count 的容器组件
export default connect((state) => ({ count: state }),/*// mapDispatchToProps 的一般写法dispatch=>{return  {jia: (data) =>{// 通知 redux 执行加法dispatch(createIncrementAction(data))},jian: (data) =>{// 通知 redux 执行加法dispatch(createDecrementAction(data))},jiaAsync: (data) =>{// 通知 redux 执行加法dispatch(createIncrementAsyncAction(data, 500))},}}*/// mapDispatchToProps 的简写,{jia: createIncrementAction, // react-redux 会将action进行分发,不再需要自己调用 dispatchjian: createDecrementAction,jiaAsync: createIncrementAsyncAction,},
)(CountUI)

容器组件里面的 store 从哪里得到的?——

5、求和案例_react-redux 优化

1、容器组件和 UI 组件混成一个文件
2、无需自己给容器组件传递 store,给 包裹一个 Provider store={store} 即可
3、使用了 react-redux 后也不用自己监测 redux 中状态的改变了,容器组件可以自动完成这个工作
4、mapDispatchToProps 也可以简单的写成一个对象
5、一个组件要和 redux “打交道”要警告过哪几步?
(1)定义 UI 组件 — 不暴露
(2)引入 connect 生成一个容器组件并暴露,写法如下:

connect(state=>(key:value),// 映射状态{key: xxxxAction}//映射操作状态的方法
)(UI 组件)

(3)在 UI 组件中通过 this.props.xxx 读取和操作状态

6、多组件共享数据_redux 管理

1、定义一个 Person 组件,和 Count 组件通过 redux 共享数据
2、为 Person 组件编写:reducer、action ,配置 constant 常量

3、重点:Person 的 reducer 和 Count 的 reducer 要使用 combineReducers 进行合并,合并后的总状态时一个对象!!!
4、交给 store 的时总 reducer,最后注意在组件中取出状态的时候,记得“取到位”

export default connect((state) => ({sum: state.sum,personList: state.personList,}),{jia: createIncrementAction,},
)(Count)

Count 组件的 action

/*** 该文件专门为 Count 组件生成 action 对象*/
import { INCREMENT, DECREMENT } from '../constant'
export const createIncrementAction = (data) => {return {type: INCREMENT,data,}
}
// 同步 action,返回一般对象。同步 action 的值为 Object 类型的一般对象
export const createDecrementAction = (data) => ({type: DECREMENT,data,
})
// 异步action ,返回 函数。 异步action 就是指 action 的值为函数。异步action 中一般都会调用同步 action
export const createIncrementAsyncAction = (data, time) => {return (dispatch) => {console.log(dispatch, 'dispatch')setTimeout(() => {dispatch(createIncrementAction(data))}, time)}
}
// 数组和数字都不能够开启 异步任务,所以不会定义这些类型为异步 action

7、纯函数

1、一类特别的函数:只要是同样的输入(实参),必定得到同样的输出(返回)
2、必须遵守以下一些约束
(1)不得改参数数据
(2)不会产生任何副作用,例如网络请求,输入和输出设备
(3)不能调用 Date.now() 或者 Math.random() 等不纯的方法
3、redux 的 reducer 函数必须是一个纯函数(不能写 unshift 等方法添加数据,如果 preState 被改写 reducer 就不纯了,页面也不会更新)!!!

8、Redux 开发者工具 redux-devtool

1、安装开发者工具
2、安装依赖(配合插件使用)
npm i redux-devtools-extension
3、store 中引入

import { composeWithDevTools } from 'redux-devtools-extension'
export default createStore(allReducer,composeWithDevTools(applyMiddleware(thunk)),
)

store.js 完整代码

/*** 该文件专门用于暴露一个store 对象,整个应用只有一个 store 对象*/
// 引入createStore,专门用于创建 redux 中最为核心的是store 对象
import { applyMiddleware, createStore, combineReducers } from 'redux'// 引入 redux-thunk 用于支持异步action
import thunk from 'redux-thunk'// 引入为 Count 组件服务的reducer
import countReducer from './reducers/count'
import personReducer from './reducers/person'
import { composeWithDevTools } from 'redux-devtools-extension'// 汇总所有的 reducer 变成一个总的 reducer
const allReducer = combineReducers({sum: countReducer,personList: personReducer,
})export default createStore(allReducer,composeWithDevTools(applyMiddleware(thunk)),
)

五、项目打包运行

npm run build

使用 serve 插件可以在本地开启一个本地服务器,使用命令 serve 就可以启动当前的文件夹
npm i serve -g

项目资源文件

相关文章:

08_React redux

React redux 一、理解1、学习文档2、redux 是什么吗3、什么情况下需要使用 redux4、redux 工作流程5、react-redux 模型图 二、redux 的三个核心概念1、action2、reducer3、store 三、redux 的核心 API1、getState()2、dispatch() 四、使用 redux 编写应用1、求和案例\_redux 精…...

2024华为杯研究生数学建模竞赛(研赛)选题建议+初步分析

难度&#xff1a;DE<C<F&#xff0c;开放度&#xff1a;CDE>F。 华为专项的题目&#xff08;A、B题&#xff09;暂不进行选题分析&#xff0c;不太建议大多数同学选择&#xff0c;对自己专业技能有很大自信的可以选择华为专项的题目。后续会直接更新A、B题思路&#…...

001.从0开始实现线性回归(pytorch)

000动手从0实现线性回归 0. 背景介绍 我们构造一个简单的人工训练数据集&#xff0c;它可以使我们能够直观比较学到的参数和真实的模型参数的区别。 设训练数据集样本数为1000&#xff0c;输入个数&#xff08;特征数&#xff09;为2。给定随机生成的批量样本特征 X∈R10002 …...

Relations Prediction for Knowledge Graph Completion using Large Language Models

文章目录 题目摘要简介相关工作方法论实验结论局限性未来工作 题目 使用大型语言模型进行知识图谱补全的关系预测 论文地址&#xff1a;https://arxiv.org/pdf/2405.02738 项目地址&#xff1a; https://github.com/yao8839836/kg-llm 摘要 知识图谱已被广泛用于以结构化格式表…...

2024年中国研究生数学建模竞赛D题思路代码分析——大数据驱动的地理综合问题

地理系统是自然、人文多要素综合作用的复杂巨系统[1-2]&#xff0c;地理学家常用地理综合的方式对地理系统进行主导特征的表达[3]。如以三大阶梯概括中国的地形特征&#xff0c;以秦岭—淮河一线和其它地理区划的方式揭示中国气温、降水、植被、土壤及生态环境在水平和垂直方向…...

全国31省对外开放程度、经济发展水平、政府干预程度指标数据(2000-2022年)

旨在分析2000-2022年间中国31个省份的对外开放程度、经济发展水平和政府干预程度&#xff0c;探讨其背后的动因与影响。 2000年-2022年 全国31省对外开放程度、经济发展水平、政府干预程度指标数据https://download.csdn.net/download/2401_84585615/89478612 数据概览 对外…...

计算机网络传输层---课后综合题

线路&#xff1a;TCP报文下放到物理层传输。 TCP报文段中&#xff0c;“序号”长度为32bit&#xff0c;为了让序列号不会循环&#xff0c;则最多能传输2^32B的数据&#xff0c;则最多能传输&#xff1a;2^32/1500B个报文 结果&#xff1a; 吞吐率一个周期内传输的数据/周期时间…...

【homebrew安装】踩坑爬坑教程

homebrew官网&#xff0c;有安装教程提示&#xff0c;但是在实际安装时&#xff0c;由于待下载的包的尺寸过大&#xff0c;本地git缓存尺寸、超时时间的限制&#xff0c;会报如下错误&#xff1a; error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly&#xf…...

反游戏学(Reludology):概念、历史、现状与展望?(豆包AI版)

李升伟 以下是关于“反游戏学&#xff08;Reludology&#xff09;&#xff1a;概念、历史、现状与展望”的综述&#xff1a; 一、概念 反游戏学&#xff08;Reludology&#xff09;是一个相对较新且不太常见的概念&#xff0c;目前尚未有统一明确的定义。一般来说&#xf…...

【C/C++语言系列】实现单例模式

1.单例模式概念 定义&#xff1a;单例模式是一种常见的设计模式&#xff0c;它可以保证系统中一个类只有一个实例&#xff0c;而且该实例易于外界访问&#xff08;一个类一个对象&#xff0c;共享这个对象&#xff09;。 条件&#xff1a; 只有1个对象易于外界访问共享这个对…...

A. Make All Equal

time limit per test 1 second memory limit per test 256 megabytes You are given a cyclic array a1,a2,…,ana1,a2,…,an. You can perform the following operation on aa at most n−1n−1 times: Let mm be the current size of aa, you can choose any two adjac…...

业务安全治理

业务安全治理 1.账号安全撞库账户盗用 2.爬虫与反爬虫3.API网关防护4.钓鱼与反制钓鱼发现钓鱼处置 5.大数据风控风控介绍 1.账号安全 撞库 撞库分为垂直撞库和水平撞库两种&#xff0c;垂直撞库是对一个账号使用多个不同的密码进行尝试&#xff0c;可以理解为暴力破解&#x…...

HelpLook VS GitBook,在线文档管理工具对比

在线文档管理工具在当今时代非常重要。随着数字化时代的到来&#xff0c;人们越来越依赖于电子文档来存储、共享和管理信息。无论是与团队合作还是与客户分享&#xff0c;人们都可以轻松地共享文档链接或通过设置权限来控制访问。在线文档管理工具的出现大大提高了工作效率和协…...

docker面经

docker面经在线链接 docker面经在线链接&#x1f517;&#xff1a; (https://h03yz7idw7.feishu.cn/wiki/N3CVwO3kMifLypkJqnic9wNynKh)...

Python 中的 Kombu 类库

Kombu 是一个用于 Python 的消息队列库&#xff0c;提供了高效、灵活的消息传递机制。它是 Celery 的核心组件之一&#xff0c;但也可以单独使用。Kombu 支持多种消息代理&#xff08;如 RabbitMQ、Redis、Amazon SQS 等&#xff09;&#xff0c;并提供了消息生产者和消费者的功…...

safepoint是什么?有什么用?

在JVM中&#xff0c;safepoint&#xff08;安全点&#xff09;是一个非常重要的概念&#xff0c;特别是在垃圾回收&#xff08;GC&#xff09;和其他需要暂停所有应用线程的操作中。 什么是safepoint Safepoint是JVM执行过程中一个特定的位置&#xff0c;在这个位置上&#x…...

axios相关知识点

一、基本概念 1、基于Promise:Axios通过Promise实现异步请求&#xff0c;避免了传统回调函数导致的“回调地狱”问题&#xff0c;使得代码更加清晰和易于维护。 2、跨平台&#xff1a;Axios既可以在浏览器中运行&#xff0c;也可以在Node.js环境中使用&#xff0c;为前后端开…...

LeetCode 面试经典150题 67.二进制求和

415.字符串相加 思路一模一样 题目&#xff1a;给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 eg&#xff1a; 输入a“1010” b“1011” 输出“10101” 思路&#xff1a;从右开始遍历两个字符串&#xff0c;因为右边是低位先运算。如果…...

Dell PowerEdge 网络恢复笔记

我有一台Dell的PowerEdge服务器&#xff0c;之前安装了Ubuntu 20 桌面版。突然有一天不能开机了。 故障排查 Disk Error 首先是看一下机器的正面&#xff0c;有一个非常小的液晶显示器&#xff0c;只能显示一排字。 上面显示Disk Error&#xff0c;然后看挂载的硬盘仓&#…...

Java面试——集合篇

1.Java中常用的容器有哪些&#xff1f; 容器主要包括 Collection 和 Map 两种&#xff0c;Collection 存储着对象的集合&#xff0c;而 Map 存储着键值对(两个对象)的映射表。 如图&#xff1a; 面试官追问&#xff1a;说说集合有哪些类及他们各自的区别和特点&#xff1f; S…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...