Axios使用详解

article/2025/9/20 19:43:51

文章目录

  • 一、Promise的使用
    • 1. 基本语法
    • 2. Promise三种状态
    • 3. Promise链式调用
        • 1. 基本写法
        • 2. 使用静态方法
        • 3. 直接返回
    • 4. Promise.all
    • 5. Promise.race
  • 二、Axios使用
    • 1. 安装并引入
    • 2. 发送请求
    • 3. config配置
    • 4. 响应结构
    • 5. 并发请求
    • 6. 全局配置
    • 6. 创建实例
    • 7. 实例方法
    • 8. 拦截器
      • 请求拦截器
      • 响应拦截器
    • 9. Axios 封装
  • 三、Axios 踩过的坑
    • 1. 传递的参数为数组时的编码问题
    • 2. 使用 data 传递参数时的问题(使用qs)

一、Promise的使用

ES6 中一个非常重要和好用的特性就是 Promise,Promise 是异步编程的一种解决方案,一种很常见的场景应该就是网络请求了。

1. 基本语法

这里使用一个定时器来模拟异步事件,Promise 的基本语法如下:

  1. new Promise 对象,传入一个回调函数,在执行传入的回调函数时,会传入两个参数,resolve、reject,这两个参数本身又是函数
  2. 当请求成功,调用 resolve() 时,执行 then() 中的方法
  3. 当请求失败,调用 reject() 时,执行 catch() 中的方法
  • 一种写法,链式写法:

    new Promise((resolve, reject) => {setTimeout(() => {// 成功的时候调用resolveresolve('Hello World')// 失败的时候调用rejectreject('error message')}, 1000)
    }).then((data) => {console.log(data);
    }).catch((err) => {console.log(err);
    })
    
  • 另一种写法,new Promise 时传入三个函数:

    new Promise((resolve, reject) => {setTimeout(() => {resolve('Hello Vuejs')reject('error message')}, 1000)
    }).then(data => {console.log(data);
    }, err => {console.log(err);
    })
    

2. Promise三种状态

在这里插入图片描述

当我们开发中有异步操作时,就可以给异步操作包装一个 Promise。异步操作之后会有三种状态

  • pending:等待状态,比如正在进行网络请求,或者定时器没有到时间。
  • fulfill:满足状态,当我们主动回调了 resolve 时,就处于该状态,并且会回调 .then()
  • reject:拒绝状态,当我们主动回调了 reject 时,就处于该状态,并且会回调 .catch()

3. Promise链式调用

1. 基本写法

通过 return new Promise() 来发送第二次网络请求

new Promise((resolve, reject) => {// 第一次网络请求的代码setTimeout(() => {resolve()}, 1000)}).then(() => {// 第一次拿到结果的处理代码console.log('111');// 在第一次处理中再次发送网络请求return new Promise((resolve, reject) => {// 第二次网络请求的代码setTimeout(() => {resolve()}, 1000)})
}).then(() => {// 第二次处理的代码console.log('222');return new Promise((resolve, reject) => {// 第三次网络请求的代码setTimeout(() => {resolve()})})
}).then(() => {// 第三处理的代码console.log('333');
})

2. 使用静态方法

  • Promise.resovle():将数据包装成 Promise 对象,并且在内部回调 resolve() 函数
  • Promise.reject():将数据包装成 Promise 对象,并且在内部回调 reject() 函数
new Promise((resolve, reject) => {setTimeout(() => {resolve('111')}, 1000)
}).then(res => {// 1.自己处理10行代码console.log(res, '第一层的10行处理代码');// 2.对结果进行第一次处理return Promise.resolve(res + '222')
}).then(res => {console.log(res, '第二层的10行处理代码');return Promise.resolve(res + '333')
}).then(res => {console.log(res, '第三层的10行处理代码');
})

3. 直接返回

  • 使用 return data 来替代 return Promise.resovle(data)
  • 使用 throw data 来替代 return Promise.reject(data)
new Promise((resolve, reject) => {setTimeout(() => {resolve('111')}, 1000)
}).then(res => {// 1.自己处理10行代码console.log(res, '第一层的10行处理代码');// 这里是直接返回字符串,相当于 Promise.resovle(res + '111')return res + '111';
}).then(res => {console.log(res, '第二层的10行处理代码');// 对结果进行第一次处理(出错)// 相当于 return Promise.reject('error message')throw 'error message'
}).then(res => {console.log(res, '第三层的10行处理代码');
}).catch(err => {console.log(err);
})

4. Promise.all

Promse.all 在处理多个异步处理时非常有用,在所有请求都成功后才执行 then,比如说需要等两个或多个异步操作的数据回来以后才正常显示。

成功时返回的是数组;失败时候返回最先被 reject 失败状态的值。

Promise.all([new Promise((resolve, reject) => {setTimeout(() => {resolve('111')}, 2000)}),new Promise((resolve, reject) => {setTimeout(() => {resolve('222')}, 1000)})
]).then(results => {console.log(results);	// ['111', '222']
})

5. Promise.race

Promse.race 就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3]) 里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

二、Axios使用

官方网站:http://www.axios-js.com/
官方文档:http://www.axios-js.com/zh-cn/docs/

Axios 是一个基于 Promise(ES6中用于处理异步的)的 HTTP 库,用于浏览器和 node.js 中。

1. 安装并引入

  • 安装:

    npm install axios --save
    
  • 引入 axios:

    import axios from 'axios'
    

2. 发送请求

Axios 支持多种请求方式,调用方式(中括号中的内容可省略):

axios(config)//请求方法的别名
axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.post(url[, data[, config]])
axios.put(url[, data[, config]])
axios.patch(url[, data[, config]])

注意:在使用别名方法时, url、method、data 这些属性都不必在配置中指定。

3. config配置

常用的一些配置有:

  • url:请求的服务器 URL

  • method:请求服务器时使用的方法,若没有指定方法,默认使用 get

  • baseURLbaseURL 将自动加在 url 前面

  • data/params:这两个都是用于传递数据的,不同的是 data 会把数据放入请求体中params 会把数据放入 URL中,因此 methodPOST/PUT/PATCH 时,使用 data,其余使用 params

    注意:使用 data 传递值的时候,要使用 qs.stringify() 将对象序列化成URL的形式,否则后台接收不到值。详见第三章第2节

  • timeout:超时时间

config 配置大全(摘自官方文档:戳这里):

{// `url` 是用于请求的服务器 URLurl: '/user',// `method` 是创建请求时使用的方法method: 'get', // default// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URLbaseURL: 'https://some-domain.com/api/',// `transformRequest` 允许在向服务器发送前,修改请求数据// 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法// 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 StreamtransformRequest: [function (data, headers) {// 对 data 进行任意转换处理return data;}],// `transformResponse` 在传递给 then/catch 前,允许修改响应数据transformResponse: [function (data) {// 对 data 进行任意转换处理return data;}],// `headers` 是即将被发送的自定义请求头headers: {'X-Requested-With': 'XMLHttpRequest'},// `params` 是即将与请求一起发送的 URL 参数// 必须是一个无格式对象(plain object)或 URLSearchParams 对象params: {ID: 12345},// `paramsSerializer` 是一个负责 `params` 序列化的函数// (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)paramsSerializer: function(params) {return Qs.stringify(params, {arrayFormat: 'brackets'})},// `data` 是作为请求主体被发送的数据// 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'// 在没有设置 `transformRequest` 时,必须是以下类型之一:// - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams// - 浏览器专属:FormData, File, Blob// - Node 专属: Streamdata: {firstName: 'Fred'},// `timeout` 指定请求超时的毫秒数(0 表示无超时时间)// 如果请求话费了超过 `timeout` 的时间,请求将被中断timeout: 1000,// `withCredentials` 表示跨域请求时是否需要使用凭证withCredentials: false, // default// `adapter` 允许自定义处理请求,以使测试更轻松// 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)).adapter: function (config) {/* ... */},// `auth` 表示应该使用 HTTP 基础验证,并提供凭据// 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头auth: {username: 'janedoe',password: 's00pers3cret'},// `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'responseType: 'json', // default// `responseEncoding` indicates encoding to use for decoding responses// Note: Ignored for `responseType` of 'stream' or client-side requestsresponseEncoding: 'utf8', // default// `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称xsrfCookieName: 'XSRF-TOKEN', // default// `xsrfHeaderName` is the name of the http header that carries the xsrf token valuexsrfHeaderName: 'X-XSRF-TOKEN', // default// `onUploadProgress` 允许为上传处理进度事件onUploadProgress: function (progressEvent) {// Do whatever you want with the native progress event},// `onDownloadProgress` 允许为下载处理进度事件onDownloadProgress: function (progressEvent) {// 对原生进度事件的处理},// `maxContentLength` 定义允许的响应内容的最大尺寸maxContentLength: 2000,// `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejectevalidateStatus: function (status) {return status >= 200 && status < 300; // default},// `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目// 如果设置为0,将不会 follow 任何重定向maxRedirects: 5, // default// `socketPath` defines a UNIX Socket to be used in node.js.// e.g. '/var/run/docker.sock' to send requests to the docker daemon.// Only either `socketPath` or `proxy` can be specified.// If both are specified, `socketPath` is used.socketPath: null, // default// `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:// `keepAlive` 默认没有启用httpAgent: new http.Agent({ keepAlive: true }),httpsAgent: new https.Agent({ keepAlive: true }),// 'proxy' 定义代理服务器的主机名称和端口// `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据// 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。proxy: {host: '127.0.0.1',port: 9000,auth: {username: 'mikeymike',password: 'rapunz3l'}},// `cancelToken` 指定用于取消请求的 cancel token// (查看后面的 Cancellation 这节了解更多)cancelToken: new CancelToken(function (cancel) {})
}

4. 响应结构

某个请求的响应包含以下信息

{// `data` 由服务器提供的响应data: {},// `status` 来自服务器响应的 HTTP 状态码status: 200,// `statusText` 来自服务器响应的 HTTP 状态信息statusText: 'OK',// `headers` 服务器响应的头headers: {},// `config` 是为请求提供的配置信息config: {},// 'request'// `request` is the request that generated this response// It is the last ClientRequest instance in node.js (in redirects)// and an XMLHttpRequest instance the browserrequest: {}
}

5. 并发请求

使用 axios.all(),可以放入多个请求的数组,类似于 Promise.all。

axios.all([]) 返回的结果是一个数组,使用 axios.spread 可将数组 [res1,res2] 展开为 res1, res2

axios.all([axios({url: 'http://123.207.32.32:8000/home/multidata'
}), axios({url: 'http://123.207.32.32:8000/home/data',params: {type: 'sell',page: 5}
})]).then(results => {console.log(results);console.log(results[0]);
})

6. 全局配置

开发中可能很多参数都是固定的。这个时候我们就可以利用 axiox 的全局配置

axios.defaults.baseURL =123.207.32.32:8000’
axios.defaults.headers.post[‘Content-Type’] = ‘application/x-www-form-urlencoded’;

6. 创建实例

当我们从 axios 模块中导入对象时,使用的实例是默认的实例。当给该实例设置一些默认配置时,这些配置就被固定下来了。但是后续开发中,某些配置可能会不太一样。比如某些请求需要使用特定的 baseURL 或者 timeout 或者 content-Type 等。

这个时候,我们就可以创建新的实例,并且传入属于该实例的配置信息

  • 创建一个实例:
axios.create([config])
  • 例如:

    const instance = axios.create({baseURL: 'https://some-domain.com/api/',timeout: 1000,headers: {'X-Custom-Header': 'foobar'}
    });
    

7. 实例方法

以下是可用的实例方法。指定的配置将与实例的配置合并。

axios#request(config)
axios#get(url[, config])
axios#delete(url[, config])
axios#head(url[, config])
axios#options(url[, config])
axios#post(url[, data[, config]])
axios#put(url[, data[, config]])
axios#patch(url[, data[, config]])

8. 拦截器

axios 提供了拦截器,用于我们在发送每次请求或者得到相应后,进行对应的处理。

请求拦截器

// 添加请求拦截器
axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config;}, function (error) {// 对请求错误做些什么return Promise.reject(error);});//为实例添加请求拦截器
const instance = axios.create();
instance.interceptors.request.use(function () {/*同上面*/});

发送请求前函数的使用场景:

  1. 当发送网络请求时,在页面中添加一个 loading 组件,作为动画
  2. 某些请求要求用户必须登录,判断用户是否有 token,如果没有 token 跳转到 login 页面
  3. 对请求的参数进行序例化

请求拦截中错误拦截应用:

  • 如请求超时,可以将页面跳转到一个错误页面中

响应拦截器

// 添加响应拦截器
axios.interceptors.response.use(function (response) {// 对响应数据做点什么return response;}, function (error) {// 对响应错误做点什么return Promise.reject(error);});//为实例添加响应拦截器
const instance = axios.create();
instance.interceptors.response.use(function () {/*同上面*/});

响应的成功拦截中,主要是对数据进行过滤。

响应的失败拦截中,可以根据 status 判断报错的错误码,跳转到不同的错误提示页面。

9. Axios 封装

这是对 Axios 的一个简单的封装

import axios from 'axios'export function request(config) {// 1.创建axios的实例const instance = axios.create({baseURL: 'http://123.207.32.32:8000',timeout: 5000})// 2.axios的拦截器// 2.1.请求拦截的作用instance.interceptors.request.use(config => {// console.log(config);// 1.比如config中的一些信息不符合服务器的要求// 2.比如每次发送网络请求时, 都希望在界面中显示一个请求的图标// 3.某些网络请求(比如登录(token)), 必须携带一些特殊的信息return config}, err => {// console.log(err);})// 2.2.响应拦截instance.interceptors.response.use(res => {// console.log(res);return res.data}, err => {console.log(err);})// 3.发送真正的网络请求return instance(config)
}

三、Axios 踩过的坑

1. 传递的参数为数组时的编码问题

引入:

import axios from 'axios'
import qs from 'qs'
  • get / delete请求方式解决方式如下

    axios.get(url, {params: {ids: [1,2,3],type: 1},paramsSerializer: params => {return qs.stringify(params, { indices: false })}})axios.delete(url, {params: {ids: [1,2,3],type: 1},paramsSerializer: params => {return qs.stringify(params, { indices: false })}})
    
  • post / put 请求方式解决方式如下

    axios.post(url, qs.stringify(params: {ids: [1,2,3],type: 1}, { indices: false }))axios.put(url, qs.stringify(params: {ids: [1,2,3],type: 1}, { indices: false }))
    
  • 转换的方式有四种:

    qs.stringify({ids: [1, 2, 3]}, { indices: false })//形式: ids=1&ids=2&ids=3
    qs.stringify({ids: [1, 2, 3]}, {arrayFormat: ‘indices‘})//形式: ids[0]=1&aids1]=2&ids[2]=3
    qs.stringify({ids: [1, 2, 3]}, {arrayFormat: ‘brackets‘})//形式:ids[]=1&ids[]=2&ids[]=3
    qs.stringify({ids: [1, 2, 3]}, {arrayFormat: ‘repeat‘}) 
    //形式: ids=1&ids=2&ids=3
    

参考:axios传递数组参数爬坑总结

2. 使用 data 传递参数时的问题(使用qs)

问题描述:在用 Axios 发送 POST/PUT 请求时,参数是放在请求体中的,因此要使用 data 来传递值:

axios({method: 'post',url: '/api/lockServer/search',data: {"username": "test","psd": "123456"} 
})

但是在后台(Tomact + SpringBoot + SpringMVC)接收参数的时候,接收不到。

解决方案:

  1. qs.stringify() 将对象序列化成URL的形式,qsaxios 里面自带的,所以直接引入就可以了
  2. 设置请求头里的 Content-Typeapplication/x-www-form-urlencoded(实测不加也可以)
import qs from 'qs'
let data = {"username": "test","psd": "123456"
}axios({//headers: {//    'Content-Type': 'application/x-www-form-urlencoded'//},method: 'post',url: '/api/lockServer/search',data: qs.stringify(data)
})

axios qs


http://chatgpt.dhexx.cn/article/vSCE1DQJ.shtml

相关文章

Uncaught (in promise) Error: Network Error at e.exports (axios.js:8:6410) at d.onerror (axio

axios报错&#xff1a; 原因&#xff1a; 后端没有给跨域权限&#xff0c;后端需要设置允许跨域的响应头&#xff0c;即可解决。 解决&#xff1a; node端设置响应头&#xff0c;解决跨域问题 。

axios封装

不要过度封装&#xff01;封装一个最简单的Axios&#xff01; - 掘金 (juejin.cn) 1 初始化 axios 实例 通过 create 方法我们得到了一个 axios 的实例&#xff0c;该实例上有很多方法&#xff0c;比如拦截器等等。我们创建实例的时候可以配置一些基础设置&#xff0c;比如基础…

axios学习

文章目录 前言一、axios的理解和使用axios的特点axios的安装方式axios的基本配置 二、axios的基本使用1.axios四种常用请求方式2.四种方式的基本使用基本架构代码示例&#xff1a;1. GET请求2. POST请求3. PUT请求4. DELETE请求 3.axios的别名方式请求使用 前言 axios是一个基…

vue封装axios

(4条消息) Vue——axios的二次封装_前端杂货铺的博客-CSDN博客 1.下载axios依赖包 npm install axios2.在src目录下新建utils文件夹&#xff0c;在utils文件夹下新建request.js文件 3.request.js import axios from axios import { Message, MessageBox } from element-ui …

axios

SegmentFault 头条问答专栏讲堂职位活动 消息注册 登录 home javascriptphppythonjavamysqliosandroidnode.jshtml5linuxccss3gitgolangrubyvimdockermongodb 文 axios 中文文档 翻译 axiosjavascript farmerz 2月24日发布 2 推荐 45 收藏&#xff0c;3.2k 浏览 axios 版…

Axios介绍

Axios是专注于网络数据请求的库&#xff0c;相比于XMLHttpRequest对象。axios简单易用&#xff0c;相比于jQuery&#xff0c;axios更加轻量化&#xff0c;只专注于网络数据请求 引入外部js文件 <script src"https://unpkg.com/axios/dist/axios.min.js"><…

VUE的axios的详细介绍和用法

Vue中发送网络请求有非常多的方式, 那么, 在开发中, 我们该如何选择呢? 选择一: 传统的Ajax是基于XMLHttpRequest(XHR) 为什么不用它呢? 非常好解释, 配置和调用方式等非常混乱.编码起来看起来就非常蛋疼. 所以真实开发中很少直接使用, 而是使用jQuery-Ajax 选择二: 在前…

AJAX,Axio异步框架(对原生AJAX封装)。web分区

1.Ajax的理解 以前服务器里的数据&#xff0c;都是存在Servlet域里&#xff0c;然后发给JSP&#xff0c;来进行显示。 有了AJAX&#xff0c;可以和服务器通信。不需要JSP作页面。 可以在Servlet把数据发给浏览器&#xff0c;然后在HTML页面显示。 1.1 以前的方法 1.2 现在的方…

类方法和对象方法的区别

类方法和对象方法 1.类方法属于本类的方法&#xff0c;不会因创建对象的不同而改变&#xff0c;类方法随着类的字节码文件加载而加载&#xff1b; 2.对象方法属于当前类创建的某个对象&#xff0c;会随着创建对象的不同而改变。如下图所示代码&#xff1a;

python中什么叫类、什么叫对象_Python中的类和对象是什么

一、面向过程和面向对象 面向过程:根据业务逻辑从上到下写代码。 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程。 二、类和对象 1、类的概念 面向对象编程的2个非常重要的概念:类和对象是面向对象编程的核心。 在使用对…

类与对象的区别?

对于初学者来说&#xff0c;类与对象之间的关系的非常模糊不清的&#xff0c;在这里跟大家分享一下&#xff0c;让初学者有所帮助。 一、类的概念&#xff1a; 类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述&#xff0c;其内部包括属性…

Java类和对象 详解(一)

一、面向对象简述 面向对象是一种现在最为流行的程序设计方法&#xff0c;几乎现在的所有应用都以面向对象为主了&#xff0c;最早的面向对象的概念实际上是由IBM提出的&#xff0c;在70年代的Smaltalk语言之中进行了应用&#xff0c;后来根据面向对象的设计思路&#xff0c;才…

C++类和对象详细总结

目录 目录 类与对象概念 什么是对象 什么是类 什么是方法&#xff1a; 自定义类型&#xff08;类的关键字&#xff1a;class&#xff09; 定义类的格式 封装 类的特性 访问权限以及访问限定符 struct 定义的类和class定义的类的区别&#xff1a; 小结 对象中包含了…

C++类和对象详解

类与对象上篇&#xff1a; 主要内容&#xff1a; 1.类和对象的区别。 2.类的定义。 3.类的访问限定符和封装 4.类的作用域 5.类的实例化&#xff08;用类类型创建对象&#xff09; 6.计算类对象的大小 7.this指针 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析…

面向过程和面向对象区别

&#xff08;1&#xff09;从设计思路来看。 面向过程&#xff1a;程序设计的重点是分析解决问题的步骤&#xff0c;以及完成步骤的流程&#xff0c;是一种结构化自上而下的程序设计方法。面向对象&#xff1a;程序设计的重点是把构成问题的事物分解成对象&#xff0c;从局部着…

Java基础——类和对象

目录 一、类和对象的基本概念 二、类与对象的定义与使用 1.创建类的语法&#xff1a; 2. 创建具体的对象&#xff1a; 3.范例&#xff08;创建一个Person 类的对象&#xff09; 三、static关键字 &#xff08;一&#xff09;static修饰属性&#xff08;类属性、类变量&a…

类,对象,方法与函数的区别

面向对象&#xff08;Object oriented Programming&#xff0c;OOP)编程 的思想主要是针对大型软件设计而来的。面向对象编程将数据和操作数据相关的方法封装到对象中&#xff0c;组织代码和数据的方式更加接近人的思维&#xff0c;使程序的扩展性更强、可读性更好&#xff0c;…

C++的类和对象

目录 C面向对象的三大特性&#xff1a;封装、继承、多态 封装 构造函数和析构函数 构造函数的分类与调用 深拷贝与浅拷贝 类对象作为类成员 静态成员 成员变量和成员函数是分开存储的 const修饰成员函数 友元 运算符重载 继承 多态 C面向对象的三大特性&#xff1…

java实例和对象对象的区别_java中实例与对象的区别和联系

对象是抽象的说法&#xff0c;你可以把它看作一个符合它自身定义的所有实例的代表&#xff0c;而实例则是对象的现实体现。 你可以说一个实例是一个对象&#xff0c;但你不能说一个对象是一个实例。因为定义对象时只是把自身的规则和逻辑定义好&#xff0c;实例可以通过输入不同…

怎么来理解java类和对象的区别

对象在需求中的使用 在具体问题中如何使用面向对象去分析问题&#xff0c;和如何使用面向对象。 以把大象装冰箱为例进行分析&#xff1a;在针对具体的需求&#xff0c;可以使用名词提炼的办法进行分析&#xff0c;寻找具体的对象。 需求&#xff1a;把大象装冰箱里 对象&…