第 2 章:AJAX 的使用

news2024/11/15 13:46:11

AJAX 的使用

核心对象:XMLHttpRequest,AJAX 的所有操作都是通过该对象进行的。

1. 使用步骤

  1. 创建 XMLHttpRequest 对象
    var xhr = new XMLHttpRequest();

  2. 设置请求信息

xhr.open(method, url);

//可以设置请求头,一般不设置
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  1. 发送请求
    xhr.send(body) //get 请求不传 body 参数,只有 post 请求使用

  2. 接收响应

//xhr.responseXML 接收 xml 格式的响应数据
//xhr.responseText 接收文本格式的响应数据
xhr.onreadystatechange = function (){
	if(xhr.readyState == 4 && xhr.status == 200){
		var text = xhr.responseText;
		console.log(text);
	}
}

2. AJAX 请求状态

  • xhr.readyState 可以用来查看请求当前的状态
  • readyState

readystate是xhr对象中的属性,表示状态0, 1, 2, 3, 4:

  • 0: 表示 XMLHttpRequest 实例已经生成,但是 open()方法还没有被调用。
  • 1: 表示 send()方法还没有被调用,仍然可以使用 setRequestHeader(),设定 HTTP请求的头信息。
  • 2: 表示 send()方法已经执行,并且头信息和状态码已经收到。
  • 3: 表示正在接收服务器传来的 body 部分的数据。
  • 4: 表示服务器数据已经完全接收,或者本次接收已经失败了

3. AJAX发送GET请求

需求:点击按钮,向服务端发送请求,把从服务端返回的响应体结果在文本框里面展示出来(在div里面做一个呈现)

3.1 GET.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AJAX GET 请求</title>
    <style>
        #result {
            width: 200px;
            height: 100px;
            border: solid 1px #90b;
        }
    </style>
</head>
<body>
    <button id="result1">点击发送请求</button>
    <div id="result"></div>
    <script>
        // 获取button元素
        const btn = document.getElementById('result1');
        const result = document.getElementById('result');

        // 绑定事件
        btn.onclick = function () {
            // 1. 创建 XMLHttpRequest 对象
            const xhr = new XMLHttpRequest();
            // 2. 初始化 设置请求方法和 url
            xhr.open('GET', 'http://127.0.0.1:8000/server');
            // 发送请求
            xhr.send();
            // 4. 事件绑定 处理服务端返回的结果
            xhr.onreadystatechange = function () {
                // 判断(服务端返回了所有的结果)
                if(xhr.readyState === 4) {
                    // 判断响应状态码 200 404 403 401 500
                    // 2xx 成功
                    if (xhr.status >= 200 && xhr.status < 300) {
                        // // 处理结果 行 头 空行 体
                        // // 1. 响应行
                        // console.log(xhr.status); // 状态码
                        // console.log(xhr.statusText); // 状态字符串
                        // console.log(xhr.getAllResponseHeaders()); // 所有响应头
                        // console.log(xhr.response); // 响应体
                        
                        // 设置 result 的文本
                        result.innerHTML = xhr.response;
                    }

                }
            }
        }
    </script>
</body>
</html>

3.2 server.js

// 1. 引入express
const express = require('express');

// 2. 创建应用对象
const app = express();

// 3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装
app.get('/server', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 设置响应体
  response.send('Hello AJAX');
});

// 4. 监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动, 8000 端口监听中....');
});

3.3 AJAX设置GET请求参数

  • 直接在url后面用?分割,然后加参数的名与值
  • 如果有多个参数就用&分开
    在这里插入图片描述

4. AJAX发送POST请求

需求:鼠标光标移进文本框,就会向服务端发送请求,服务端返回结果,然后把结果在该框中做一个呈现

4.1 POST.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AJAX POST 请求</title>
    <style>
        #result {
            width: 200px;
            height: 100px;
            border: solid 1px #903;
        }

    </style>
</head>
<body>
    <div id="result"></div>
    <script>
        // 获取元素对象
        const result = document.getElementById('result');

        // 绑定事件
        result.addEventListener("mouseover", function () {
            // 1. 创建对象
            const xhr = new XMLHttpRequest();

            // 2. 初始化 设置类型 与URL
            xhr.open('POST', 'http://127.0.0.1:8000/server');

            // 3. 发送
            xhr.send(a=100);

            // 4. 事件绑定
            xhr.onreadystatechange = function () {
                // 判断
                if (xhr.readyState === 4) {
                    // 判断状态码
                    if (xhr.status >= 200 && xhr.status < 300) {
                        // 处理服务端返回的结果
                        result.innerHTML = xhr.response;
                    }
                }
            }

        })


    </script>
</body>
</html>

4.2 server.js

// 1. 引入express
const express = require('express');

// 2. 创建应用对象
const app = express();

// 3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装

app.post('/server', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 设置响应体
  response.send('Hello AJAX POST');
});

// 4. 监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动, 8000 端口监听中....');
});

4.3 post设置参数

  • 直接在send里面设置参数
  • 可以自己设置格式,只要服务端能够处理
    在这里插入图片描述
    在这里插入图片描述

5. 设置请求头信息

  • 设置预设头信息
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  • 设置自定义头信息
xhr.setRequestHeader('name', '123');

// node.js设置
//请求类型改为all
app.all

// 设置可接收自定义请求
response.setHeader('Access-Control-Allow-Headers', '*');

6. 服务端响应JSON数据

需求:按下键盘上的任意按键,就会向服务端发送请求,服务端返回结果,然后把结果在div中做一个呈现

6.1 处理json数据

  1. 因为响应体只能发送字符串,我们可以先在服务端把要响应的数据对其进行字符串转换之后再将其发送

  2. 在客户端处理数据有两种方法,一是手动处理,二是自动处理(用的多)

  3. 手动处理:将接受到的字符串进行json格式的转换let data = JSON.parse(xhr.response);

  4. 自动处理:在前面设置好响应体的数据类型:xhr.responseType = 'json';,后面直接用该数据就行

6.1 JSON.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSON响应</title>
    <style>
        #result {
            width: 200px;
            height: 100px;
            border: solid 1px #903;
        }
    </style>

</head>
<body>
    <div id="result"></div>
    <script>
        // 获取元素对象
        const result = document.getElementById('result');
        // 绑定键盘按下事件
        window.onkeydown = function () {
            // 1. 创建对象
            const xhr = new XMLHttpRequest();
            // 设置响应体数据的类型(自动转换)
            xhr.responseType = 'json';

            // 2. 初始化 设置类型 与URL
            xhr.open('GET', 'http://127.0.0.1:8000/json-server');
            // 3. 发送
            xhr.send();
            // 4. 事件绑定
            xhr.onreadystatechange = function () {
                // 判断
                if (xhr.readyState === 4) {
                    // 判断状态码
                    if (xhr.status >= 200 && xhr.status < 300) {
                        // 处理服务端返回的结果
                        // console.log(xhr.response);
                        // result.innerHTML = xhr.response;

                        // 处理数据第一种方法:手动对数据转换
                        // let data = JSON.parse(xhr.response);
                        // result.innerHTML = data.name;

                        // 处理数据第二种方法:自动转换
                        console.log(xhr.response);
                        result.innerHTML = xhr.response.name;
                    }
                }
            }
        }
    </script>
</body>
</html>

6.2 server.js

// 1. 引入express
const express = require('express');

// 2. 创建应用对象
const app = express();

// 3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装

app.all('/json-server', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 响应头
  response.setHeader('Access-Control-Allow-Headers', '*');
  // 响应一个数据
  const data = {
    name:'张三'
  };
  // 对对象进行字符串转换
  let str = JSON.stringify(data);
  // 设置响应体
  response.send(str);
});

// 4. 监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动, 8000 端口监听中....');
});

7. nodemon自动重启工具安装

  • 每次修改js文件都需要停掉服务重新启动,比较麻烦,这个工具会在检测到js文件修改后自动重启服务

7.1 nodemon的安装

  1. 停掉服务:ctrl + c
  2. 终端输入npm install -g nodemon进行nodemon的安装

7.2 nodemon启动服务

  1. 启动服务:nodemon server.js
  2. 后面只要该文件server.js被修改,服务会自动重新启动

8. 解决 IE 缓存问题

  • IE缓存问题:IE浏览器会对AJAX的一个请求结果做一个缓存,会导致一个问题:下一次发送请求的时候,走得是本地的缓存,而非服务器返回的最新数据,在一些时效性比较强的场景,ajax缓存会影响我们的结果,它不能够正常去显示
  • 问题:在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。
  • 解决方式:浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址即可避免缓存问题。我们给url后面加一个“获取当前时间的时间戳”,因为时间不同,所以url不同,浏览器会认为这是两次不同的请求,这个时候客户端会发送一个新的请求而非走本地缓存
    xhr.open("get","/testAJAX?t="+Date.now());

8.1 IE缓存问题.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IE缓存问题</title>
    <style>
        #result {
            width: 200px;
            height: 100px;
            border: solid 1px #258;
        }
    </style>
</head>
<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        const btn = document.getElementsByTagName('button')[0];
        const result = document.querySelector('#result');
        btn.addEventListener('click', function(){
            console.log("test");
            const xhr = new XMLHttpRequest();
            xhr.open("GET", 'http://127.0.0.1:8000/ie?t=' + Date.now());
            xhr.send();
            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4) {
                    if (xhr.status >= 200 && xhr.status < 300) {
                        result.innerHTML = xhr.response;
                    }
                }
            }
        })

    </script>
</body>
</html>

8.2 server.js

// 1. 引入express
const express = require('express');

// 2. 创建应用对象
const app = express();

// 3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装

// 针对IE缓存
app.get('/ie', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 设置响应体
  response.send('Hello IE');
});

// 4. 监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动, 8000 端口监听中....');
});

9. 请求超时与网络异常处理

通过ajax给超时做一个设置,来及时给客户做一个提醒,并且在网络异常的时候也给用户来一个友好的提醒

  • 如果2s后还没有返回结果,就来一个提醒,告诉客户网络超时,请稍后重试
  • 如果网络异常,则返回一个提醒

9.1 超时与网络异常.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>超时与网络异常</title>
    <style>
        #result {
            width: 200px;
            height: 100px;
            border: solid 1px #90b;
        }

    </style>
</head>
<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        // 获取元素对象
        const btn = document.getElementsByTagName('button')[0];
        const result = document.getElementById('result');

        // 绑定事件
        btn.addEventListener("click", function () {
            // 1. 创建对象
            const xhr = new XMLHttpRequest();

            // 超时设置 2s 设置
            xhr.timeout = 2000;
            // 超时回调
            xhr.ontimeout = function () {
                result.innerHTML = "请求超时";
            }

            // 网络异常
            xhr.onerror = function () {
                alert("网络异常");
            }
            // 2. 初始化 设置类型 与URL
            xhr.open('GET', 'http://127.0.0.1:8000/delay');

            // 3. 发送
            xhr.send();

            // 4. 事件绑定
            xhr.onreadystatechange = function () {
                // 判断
                if (xhr.readyState === 4) {
                    // 判断状态码
                    if (xhr.status >= 200 && xhr.status < 300) {
                        // 处理服务端返回的结果
                        result.innerHTML = xhr.response;
                    }
                }
            }

        })


    </script>
</body>
</html>

9.2 server.js

// 1. 引入express
const express = require('express');

// 2. 创建应用对象
const app = express();

// 3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装

// 延时响应
app.get('/delay', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 延时响应
  setTimeout(() => {
    response.send('延时响应');
  }, 3000);
});

// 4. 监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动, 8000 端口监听中....');
});

9.3 断网测试

-

10. 取消请求

  • 通过代码手动取消请求
  • status:pending是处于发送过程中
  • status:cancel是取消发送

10.1 取消请求.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=q, initial-scale=1.0">
    <title>取消请求</title>
</head>
<body>
    <button>点击发送</button>
    <button>点击取消</button>
    <script>
        // 获取元素对象
        const btns = document.querySelectorAll('button');
        let x = null;
        // const controller = new AbortController();

        btns[0].onclick = function() {
            const x = new XMLHttpRequest();
            x.open('GET', 'http://127.0.0.1:8000/cancel');
            x.send();
        }
        
        // abort
        btns[1].onclick = function() {
            // controller.abort();
            x.abort();
        }

    </script>
</body>
</html>

10.2 server.js

// 1. 引入express
const express = require('express');

// 2. 创建应用对象
const app = express();

// 3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装

// 取消请求
app.get('/cancel', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 取消请求
  setTimeout(() => {
    response.send('取消请求');
  }, 3000);
});

// 4. 监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动, 8000 端口监听中....');
});

11. 请求重复发送问题

  • 解决办法 :当点击发送第二个相同的请求的时候,把第一个请求取消掉

解决步骤:

  1. 定义一个标识变量isSending为false
  2. 修改isSending为true表示发送请求
  3. 当readyState为4的时候表示请求完成,修改isSending为false
  4. 连续发送请求,但是此时的isSending还是true,所以取消该请求重新发送
  5. 如果连续发送请求,都会取消上一个发送的请求来保证只有一个请求发出,减少服务器压力

11.1 重复请求问题.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=q, initial-scale=1.0">
    <title>取消请求</title>
</head>
<body>
    <button>点击发送</button>
    <script>
        // 获取元素对象
        const btns = document.querySelectorAll('button');
        let x = null;
        // 标识变量
        let isSending = false;  // 是否正在发送Ajax请求
        // const controller = new AbortController();

        btns[0].onclick = function() {
            // 判断标识变量
            if (isSending) x.abort();  // 如果正在发送Ajax请求,则取消请求,创建一个新的请求
            // 修改 标识变量的值
            isSending = true;
            x = new XMLHttpRequest();
            x.open('GET', 'http://127.0.0.1:8000/cancel');
            x.send();
            x.onreadystatechange = function() {
                if (x.readyState === 4) {
                    // 修改标识变量
                    isSending = false;
                }
            }
        }
    </script>
</body>
</html>

11.2 server.js

// 1. 引入express
const express = require('express');

// 2. 创建应用对象
const app = express();

// 3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装

// 重复请求
app.get('/cancel', (request, response) => {
  // 设置响应头  设置允许跨域
  response.setHeader('Access-Control-Allow-Origin', '*');
  // 取消请求
  setTimeout(() => {
    response.send('重复请求');
  }, 3000);
});

// 4. 监听端口启动服务
app.listen(8000, () => {
  console.log('服务已经启动, 8000 端口监听中....');
});

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

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

相关文章

计算机网络八股文之TCP协议

TCP/IP模型 链路层 物理层&#xff1a;主要定义物理设备标准&#xff0c;如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流&#xff08;就是由1、0转化为电流强弱来进行传输&#xff0c;到达目的地后再转化为1、0&#xff0c;也就是我们…

WPS Office for Linux 12 个人版上线deepin 23商店:UI 视觉重构,新增多项 AI 功能

查看原文 全新WPS Office For Linux个人版&#xff08;12.1.0.17881&#xff09;与deepin 23的AI功能深度融合&#xff0c;正式上架在社区商店啦&#xff01; 这是 Linux 版本的一次里程碑式的重大更新。在产品能力层面上&#xff0c;在 deepin 23 上WPS Office 几乎实现了与 …

30天一次过PMP资料分享!2024备考PMP必看!!!

1、华为项目管理工具模板 2、PMP思维导图 3、PMBOK指南第七版-中文电子版 4、敏捷电子书&#xff08;含敏捷实践指南&#xff09; 5、300道敏捷题 6、PMBOK第六版章节思维导图 PMP备考攻略&#xff1a; 1. 充分了解PMP考试大纲&#xff1a; 详细了解PMP考试大纲&#xff0c;明…

IEEE Latex模板子图标题字体修改

在进行IEEE期刊论文排版时&#xff0c;可能会用到子图&#xff0c;但官方的Latex模板中&#xff0c;子图标题字体与字号和图片标题不同&#xff0c;排版出来不美观&#xff0c;下面介绍一个简单方法解决这一问题。 在tex文件头部找到这一条代码&#xff1a; \usepackage[capti…

Spring学习(四)-AOP

Spring学习&#xff08;四&#xff09;-AOP –2020年06月26日 一、AOP的概念 面向切面编程。 利用AOP可以对业务逻辑的各个部分进行隔离&#xff0c;从而使得业务逻辑各部分之间的耦合度降低&#xff0c;提高程序的可重用性&#xff0c;同时提高了开发的效率。 通俗描述&am…

Mendix 创客访谈录|Mendix赋能汽车零部件行业:重塑架构,加速实践与数字化转型

在当前快速发展的技术时代&#xff0c;汽车行业正经历着前所未有的数字化转型。全球领先的汽车零配件制造商面临着如何利用最新的数字技术优化其制造车间管理的挑战。从设备主数据管理到生产执行工单管理&#xff0c;再到实时监控产量及能耗&#xff0c;需要一个灵活、快速且高…

IF 17.1| 爱竹人士一眼就心动的数据库!

竹子具有重要的经济和生态重要性&#xff0c;并为国际贸易做出贡献。BambooGDB是现有的竹基因组学资源&#xff0c;提供了基于毛竹个体参考基因组草图的信息。然而&#xff0c;我们需要的是一种资源来加强竹科多基因组组装&#xff0c;使研究人员能够通过分支特异性比较基因组研…

Qt基础类02-坐标类QPointF

Qt基础类02-坐标类QPointF 摘要基本信息重要成员函数举例6个程序全貌QPointF::QPointF()static qreal QPointF::dotProduct(const QPointF &p1, const QPointF &p2)bool QPointF::isNull() constconst QPointF operator*(const QPointF &point, qreal factor)const…

程序员都必须要知道的 8个常见数据结构

1. 数组&#xff1a;多功能主力 什么是数组&#xff1f; 数组可能是编程中最基本、使用最广泛的数据结构。将数组视为存储在连续内存位置的项目集合。它就像学校里一排储物柜&#xff0c;每个储物柜&#xff08;元素&#xff09;按顺序编号&#xff0c;可容纳一个物品。 数组…

Qt实现图表绘制

来来来&#xff0c;今天新学习到了一个好东西&#xff0c;就是图表的绘制&#xff0c;这玩意在一般的项目开发中的使用频率还是非常高滴&#xff0c;毕竟相对于数字来说&#xff0c;这个东西更能体现出数据的变化&#xff0c;主要是耐看啊&#xff01;&#xff01;&#xff01;…

9月跨境营销热点日历!出海选品指南

9月1日 澳大利亚父亲节 澳大利亚父亲节是一个特殊的日子&#xff0c;人们用来表达对父亲的感激之情。 礼物用品&#xff1a;手表盒、雪茄盒、红酒架、腰带等。除了前面举例的几款&#xff0c;还能从哪里获取选品的灵感呢&#xff1f;店雷达给大家提供一些实操的选品思路&…

p38激酶在癌症研究中的进展

前 言&#xff1a; p38是丝裂原活化蛋白激酶MAPK家族的重要成员。p38的激活需要在Thr180、Tyr182位点发生磷酸化&#xff0c;在细胞增殖、代谢、凋亡等方面发挥重要作用&#xff0c;与多种肿瘤发展相关。 MAPK&#xff08;丝裂原活化蛋白激酶&#xff09;通路参与调控与癌症发…

【Linux】常见指令及权限相关知识详细梳理

1.Linux基本指令 1. ls指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。 对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xf…

ARM V2微架构

简介 今年V3/N3已经发布&#xff0c;但考虑到没有公布太多的细节&#xff0c;我依据手册在“ARM发布新一代高性能处理器”一文中对微架构有阐述&#xff0c;本文主要简单分析ARM V2的一些微架构内容。 IFU 1、每个cycle预测两个分支&#xff0c;这个特性在服务器系列中是N2/V…

vue数字滚动插件vue-countTo

文章目录 1. vue-countTo2. 使用2.1 安装2.2 页面使用 3. 参数4. 方法 1. vue-countTo 这是一个 vue 组件&#xff0c;它会在指定的时间内计数到目标数字 vue-countTo 是一个无依赖的轻量级 vue 组件&#xff0c;可以自行覆盖 easingFn&#xff0c;可以设置 startVal 和 endVal…

【无标题】如何申报团体标准,需要具备哪些条件

在当今快速发展的社会中&#xff0c;团体标准的重要性日益凸显。它不仅能够推动行业的进步与创新&#xff0c;还能提升企业的竞争力。那么&#xff0c;如何申报团体标准呢&#xff1f;又需要具备哪些条件呢&#xff1f;让我们一同来深入了解。 申报团体标准的流程和所需条件可能…

如何让工作汇报不再平庸?

在职场中&#xff0c;工作汇报是每位员工不可或缺的一部分&#xff0c;它不仅是展示个人成果与能力的窗口&#xff0c;也是促进团队沟通与协作的重要桥梁。 1、明确目标与听众 不同的听众有不同的关注点和期望&#xff0c;了解他们的背景和需求&#xff0c;能够让你在汇报中有…

创客匠人9月活动|预告

-----------------------------------------创客匠人&#xff1a;让知识变现不走弯路-----------------------------------------

7月刷题笔记

刷题笔记—7月 1512.好数对的数目(哈希) class Solution { public:int numIdenticalPairs(vector<int>& nums) {int cnt 0;unordered_map<int, int> hash;//nums[i]---个数for(int i 0; i < nums.size(); i) {cnt hash[nums[i]];hash[nums[i]];}return…

【鸿蒙】HarmonyOS NEXT星河入门到实战1-开发环境准备

目录 一、达成目标 二、鸿蒙开发环境准备 2.1 开发者工作下载 2.2 解压安装 2.3 运行配置安装node.js和SDK 2.4 开始创建第一个项目 2.5 预览 2.5.1 预览遇到的问题&#xff08;报错&#xff09; 2.5.2 修改内容查看预览 三、备用下载地址&#xff08;如果下载是4.X版…