Vue学习笔记

Vue学习笔记

    • 数据绑定
    • 脚手架Vue CLI
  • 组件
    • 组件化开发
    • 需要安装的插件
    • 自定义组件
      • 定义自己的组件
      • 使用自定义的组件
    • 普通组件--局部注册
    • 普通组件--全局注册
    • 普通组件的局部注册和全局注册的区别
    • 第三方组件Element-ui
    • computed 计算属性
      • 修改计算属性
    • watch 侦听器
      • 延时器防抖
      • watch 的完整写法
    • scoped样式冲突
      • scoped原理(了解)
    • 组件通信
    • prop
    • v-model原理
    • .sync
    • vue调试工具
    • ref和refs
    • 异步更新和$nextTick
  • 路由
    • 单页应用和多页应用的区别
    • 路由的基本使用
    • 组件存放目录问题
    • 路由模块封装
    • 实现导航高亮效果
      • router-link
      • 两个高亮类名的区别
      • 自定义匹配的类名
    • 声明式导航-跳转传参
      • 查询参数传参
      • 动态路由传参
      • 两种传参方式的区别
      • 动态路由可选参数
    • 路由重定向
      • 重定向
      • 404
    • 路由模式配置
  • Vuex
    • vuex的基本认识
    • Vuex的基本使用
      • 1.构建vuex多组件数据共享环境
      • 2.构建一个空仓库
    • 核心概念-state状态
      • 辅助函数-mapState
      • 不能直接修改仓库store内数据
    • 核心概念-mutations
      • 辅助函数-mapMutations(简写方法)
    • 核心概念-actions
      • 辅助函数-mapActions
    • 核心概念-getters
      • 辅助函数-mapGetters
    • 核心概念-模块module
      • vuex中从模块中访问state
      • vuex中从模块中访问getters
      • vuex中从模块中访问mutations
      • vuex中从模块中访问actions

数据绑定

v-model是实现数据双向绑定,页面发生变化,name也会发生变化;name发生变化,页面也会发生变化

<input type='text' v-model="name">

:value是实现单向绑定,name发生变化,页面就会发生变化;但是页面发生变化,name并不会发生变化

<input type='text' :value="name">

在这里插入图片描述

脚手架Vue CLI

在这里插入图片描述
在想要创建工程的目录里面输入下面内容,创建hello工程

vue create hello

选择第三个,手动选择。因为eslint暂时用不到
在这里插入图片描述
下一步,安空格取消掉Linter,然后按回车下一步
在这里插入图片描述
然后选择vue3
在这里插入图片描述
依赖存哪里去,一般选择package.json
在这里插入图片描述
是否要生成一个快照,用于后续快速创建项目
在这里插入图片描述
接下来就生成了vue工程

通过npm run serve运行

组件

组件化开发

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需要安装的插件

装了插件才有高亮
在这里插入图片描述

自定义组件

定义自己的组件

在compoents目录下新建一个MyHello.vue
然后添加基本内容,定义组件名为MyHello
在这里插入图片描述

使用自定义的组件

在这里插入图片描述
接着执行npm run serve, 便可以发现组件生效了
在这里插入图片描述

普通组件–局部注册

局部注册,只写组件名也可以,是一种简写方法
在这里插入图片描述
创建一个新的vue,输入<v…选择第一个,就可以生成默认的模板
在这里插入图片描述
生成后的效果
在这里插入图片描述

使用流程:创建组件–导入–注册–使用
在这里插入图片描述

普通组件–全局注册

在多个界面都要使用的通用组件可以进行全局注册,这样全局都能使用了
在这里插入图片描述
全局组件在main.js中进行注册
在这里插入图片描述
在完成组件创建后,在main.js中导入,然后全局注册即可.
全局注册完成之后,在所有的组件范围内都可以使用
在这里插入图片描述

普通组件的局部注册和全局注册的区别

在这里插入图片描述

第三方组件Element-ui

在这里插入图片描述

computed 计算属性

比如下面篮球数量进行更新了,礼物总数也会自动重新计算
一般属性是放data里面,而计算属性要放computed里面,并写成函数的样子
在这里插入图片描述
computed与methods区别

特点是computed的缓存机制,只有依赖数据变化才会重新计算,数据不变情况下,即使网页刷新也不会重复计算的。性能比较高
在这里插入图片描述

修改计算属性

一般情况下,计算属性是不可修改的
如果想要修改计算属性,应该将computed中的函数写法,改写成类的写法,并要有get和set两个方法
在这里插入图片描述
在这里插入图片描述
如果要实现修改,需要在set里面对依赖数值进行修改,应该将’吕‘给this.firstName,把’小布’给this.lastName。
set的本质是修改了依赖数值,然后触发了get

watch 侦听器

在这里插入图片描述
注意:
在js中,方法名不能直接出现 点.这种特殊字符的,需要加上引号
’对象.属性名‘

延时器防抖

如果数据频繁变化,后台计算会比较频繁,因此可以设置延迟器。但这种情况下只会延迟执行,但是仍然都会执行;因此再次变化的时候可以删除延迟器,添加新的延迟器,进行重新计时。
这样就可以在变化停止时,进行更新。实现防抖的功能。
(与页面无关的数据,直接绑定在this对象里面,无需额外在data里面声明timer)
在这里插入图片描述

watch 的完整写法

比如除了监听obj中words还要监听语言,那么就要声明deep:true,监听对象obj里面的每个属性。
(如果直接监听两个,就太麻烦了,特别是数量是3个、4个…的时候)
在这里插入图片描述
但是handler只会在数据修改的时候才会触发,为了使得一进页面就修改一次,可以使用immediate:true

例子:
在这里插入图片描述

scoped样式冲突

在这里插入图片描述
在这里插入图片描述
如下图所示,这是组件的vue,只是想给BaseOne加上样式,但是所有的div都加上了样式
在这里插入图片描述
为了使得样式只作用于当前组件,就需要加上scoped
在这里插入图片描述
组件还是推荐加scoped的,因为组件应该有自己的样式,而不应该作用于全局

scoped原理(了解)

加上scoped,会给当前组件内所有元素,都添加一个哈希值,div组件名改成了 div-哈希值,因此不同组件内的div不会发生样式冲突了
在这里插入图片描述
在这里插入图片描述

组件通信

在这里插入图片描述
子组件给父组件通信$emit
在这里插入图片描述
父组件给子组件通信prop
在这里插入图片描述

prop

限制使用组件的人,防止他们乱传参数。
类型校验(比如下方的进度条应该传入一个数值,如果传入一个布尔值,那就应该出错)
在这里插入图片描述
可以通过写成对象的方式,进行更加详细的校验
在这里插入图片描述
在这里插入图片描述
如果想要修改prop值,需要子组件通知父组件去修改。直接修改prop会报错。

v-model原理

两条"<input" 语句是等价的
在这里插入图片描述
v-model还要仔细看

.sync

子组件要通知父组件修改的时候,需要 通过emit实现,并补上update:字段
在这里插入图片描述
简单得说,加上.sync,相当于不用额外再去写触发事件了,子组件可以直接通过emit实现,是一种语法糖。

vue调试工具

参考链接

ref和refs

在这里插入图片描述

异步更新和$nextTick

在vue中,是要等这一段程序操作完才更新dom,这时候直接去获取焦点,是还没更新的,因此要异步去操作。
输入框获取焦点:就是光标闪烁在输入框
在这里插入图片描述
在这里插入图片描述
正确写法,$nextTick会等dom更新完后,再去获取焦点。
在这里插入图片描述
在这里插入图片描述

路由

单页应用和多页应用的区别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

路由的基本使用

在这里插入图片描述
注意安装得时候Vue2 安装vueRouter3.x vuex3.x
Vue3安装vueRouter4.x vuex4.x

在这里插入图片描述
注入完成后,就能在url中看到/#/的字符了
在这里插入图片描述
在这里插入图片描述
把用于显示的文件放在views目录里面
在这里插入图片描述

组件存放目录问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

路由模块封装

这样在main.js中只要import,以及在new Vue中加入router即可
在这里插入图片描述
把路由相关内容写在router/index.js里面。注意封装后,路径改变,要进行修改,否则找不到views。
在这里插入图片描述
但是每次移动文件位置都要改路径很麻烦,因此可以将相对路径改为绝对路径,其中@表示src目录(但不能直接写成src)

在这里插入图片描述

实现导航高亮效果

router-link

在这里插入图片描述
在这里插入图片描述

可以看到router-link本质还是a标签。会给选中的导航,添加router-link-active类

在这里插入图片描述
因此可以添加css样式,使得它高亮
在这里插入图片描述
在这里插入图片描述

两个高亮类名的区别

router-link-active模糊匹配:如果to=“/my"只要是/my开头的路径都能匹配到
router-link-exact-active精确匹配:如果to=”/my",只能匹配到/my
在这里插入图片描述

自定义匹配的类名

在这里插入图片描述
这样就能通过自定义的类名去设置样式(css)

声明式导航-跳转传参

查询参数传参

在这里插入图片描述
点击导航,就能进行跳转,url中也会携带参数。如key=黑马程序员
可以通过$route.query.key来获取,在js中则需要this.$route.query.key来获取
在这里插入图片描述

动态路由传参

在这里插入图片描述
配置导航的时候可以直接用/,而不是用 ?参数名=值 这种形式了。
在这里插入图片描述
动态路由配置的时候是words,可以获取参数就用$route.params.words
在这里插入图片描述
因此动态路由传参分为三步
1.配置动态规则 2.配导航连接 3.参数获取
在这里插入图片描述

两种传参方式的区别

在这里插入图片描述
在这里插入图片描述

动态路由可选参数

在配置路由规则的时候,参数后面添加个?就行了
在这里插入图片描述
加上?后,搜索页这样也能展示成功了。
在这里插入图片描述

路由重定向

重定向

在这里插入图片描述

404

在这里插入图片描述

路由匹配规则会从上往下依次匹配,如果发现前面三个都没匹配到,就会被path:'*'匹配到,就会重定向至模块NotFind

路由模式配置

在这里插入图片描述

Vuex

vuex的基本认识

在这里插入图片描述

Vuex的基本使用

1.构建vuex多组件数据共享环境

在这里插入图片描述
Son1组件里面只是丢了个标签和没有逻辑的button,Son2也是一样的。
在根组件里使用Son1和Son2。
在这里插入图片描述
这样多组件数据共享的环境的就搭建好了,接下去考虑如何同步三个组件的数据?

2.构建一个空仓库

如在用VueCli构建时,勾选了vuex就不需要额外安装了。
注意233和344口诀,vue2安装router3和vuex3;vue3安装router4和vuex4
在这里插入图片描述
首先在@store/index.js里面,写vuex的核心代码
包括插件安装、创建仓库、导出store给main.js
在这里插入图片描述
在main.js中,挂载到Vue对象当中
在这里插入图片描述
使用时:可以直接通过this.$store访问到store对象
在这里插入图片描述

核心概念-state状态

在这里插入图片描述
在这里插入图片描述
例子:
提供数据
在这里插入图片描述
模板中通过{{$store.state.参数名}}去使用
在这里插入图片描述
组件逻辑中通过this.$store.state.参数名来进行访问
在这里插入图片描述
在js模块中可以通过store.state.参数名来进行访问
在这里插入图片描述

辅助函数-mapState

一种简写方式,底层还是从$store.state.参数名去读取

由于直接使用this.$store.state.count实在太长了,于是可以用计算属性使得,变量的长度得以减小,这样就可以直接使用count了。但是每次这样写计算属性太麻烦。
于是可以在计算属性里面直接加入mapState(['count']),相当于count(){return ...}这么一大段,以达到简写的效果。可以通过逗号间隔,引入更多状态。
在这里插入图片描述
注意要展开运算符映射。就是要加三个点: ...mapState(['count']),不然的话就是mapState占满整个计算属性,就没法添加别的了。

导入mapState后可以直接使用,但这种一般不会这么用
在这里插入图片描述
而是给他放入计算属性里面去使用
在这里插入图片描述
因此使用组件中可以直接使用该状态,而不必$store.state.count
在这里插入图片描述

不能直接修改仓库store内数据

由于vuex遵循单向数据流,组件不能直接修改仓库的数据,因此要通过mutations通知仓库去修改
在这里插入图片描述
由于this.$store.state.count++是错误写法,检测会影响性能(即便能修改,也是不规范的,一定要遵循单向数据流),因此可以设置strict:true为严格模式,这种模式下出现这种写法会直接报错(有利于初学者检测不规范代码)。注意:但是在最终上线的时候,是不需要开启这个模式的。

核心概念-mutations

把操作state里面数据的方法,写在mutations里面。
在组件中使用,直接调用mutations,来修改state里面的数据
在这里插入图片描述
注意mutations里面的方法,第一参数一定要是state
在这里插入图片描述
这时候可以通过调用this.$store.commit("addCount"),来修改count值

mutations中的方法同样可以传递参数
在这里插入图片描述
注意只能传递一个参数,如果非要传递多个参数,可以写成,对象、数组形式。
比如下面,mutations方法中即便定义了str形参,也是接不到这个字符串的。
在这里插入图片描述
因此可以用下面的方式
在这里插入图片描述
例子:
下面例子中,$store.state.count已用计算属性简写了。如何让他和输入框input进行双向绑定?
众所周知v-model是双向绑定,但是他会直接修改仓库内的数据,不符合单向数据流,那该如何解决呢?
v-model是 :value和@input的简写,写了:value就可以将数据映射到输入框,当输入框输入内容,就可以通过@input事件来触发函数,以此来调用mutations方法,来修改仓库数据
在这里插入图片描述
触发的函数,调用mutations方法
在这里插入图片描述

辅助函数-mapMutations(简写方法)

mapState是将store中state的数据映射到computed计算属性中,组件中可以直接使用该计算属性

mapMutations是将store中mutations的方法映射到methods方法中,组件中可以直接调用该方法
在这里插入图片描述

核心概念-actions

mutations必须是执行操作时同步的,而如果要处理异步数据,就要写在actions里面。
调用则通过dispatch来调用
在这里插入图片描述
actions相当于包装一下,把异步处理掉了,再去执行mutations。
其中,context表示上下文(此处未分模块,可以当成store仓库,可以调用里面的commit来执行mutations)

辅助函数-mapActions

在这里插入图片描述
写法
在这里插入图片描述

核心概念-getters

从state中派生出一些状态,这些状态依赖state的,此时会用到getters。
比如state发生了变化,getters内相应的数据也会同步发生变化
在这里插入图片描述

辅助函数-mapGetters

映射到计算属性中
在这里插入图片描述

核心概念-模块module

当store中有很多状态时,将变得很臃肿。分模块可以让项目变得易于维护
在这里插入图片描述
模块js文件放在目录store/modules下面
将state,mutations,actions,getters都export
加载模块时的写法也要更改。其实modules:{user} 本质上就时{state,mutations,actions,getters}
在这里插入图片描述

注意store/index.js 要写上引入的模块。
为什么叫index.js其实也能理解了,他作为根模块root,可以去引入其他模块。
将整个{state,mutations,actions,getters}对象,放入new Vuex.store({})里面即可。
在这里插入图片描述
其实就是将两个子模块挂在根模块root下面。
在这里插入图片描述

vuex中从模块中访问state

分模块可以让每个模块内容写在单独的js里面,更加易于维护。
但本质上,还是单一状态树。打开state发现,两个子模块还是挂在根级别的state中

要访问模块中的状态有两种方法,第一种是纯原生,第二种是映射。注意映射的时候,模块要开启命名空间namespaced:true
在这里插入图片描述
原生方法
下述,user是模块,name是userinfo对象中的元素,userinfo是放在user模块的state里面的。
访问的只要$store.state.模块名.xxx即可,不需要加多层state,因此vuex本质上还是单一状态树,
会将子模块的state挂在根模块的state里面。
在这里插入图片描述
映射方法
1.直接将模块名进行mapState映射,那么拿到的就是模块内所有的state数据。
在这里插入图片描述
如果要取值的话,那么就从模块名为起点,从多级目录下去取。
在这里插入图片描述
2.基于子模块去映射
通过mapState('模块名',['xxx'])的方式去映射。注意这种情况下,模块一定要开启namespaced:true

在这里插入图片描述
这样就能直接使用子模块中的数据了。
注意:上述两个mapState不会冲突,只要计算属性名不相同即可。
vue调试工具中,如果没看到namespaced的话,应该是配置错误了。
在这里插入图片描述

vuex中从模块中访问getters

基本上与访问模块中的state是相同的。
除了直接通过模块名访问,这个写法要通过中括号的方式。
在这里插入图片描述
通过原生方法去获取数据
在这里插入图片描述
为什么要用中括号,变了花样呢?
通过打印发现,有个值为user/UpperCaseName,由于有特殊字符,因此无法直接通过点. 来实现,要用中括号
在这里插入图片描述
为了方便书写,建议通过子模块映射,这样可以直接获取数据
在这里插入图片描述
在这里插入图片描述

vuex中从模块中访问mutations

为了不将mutations和actions挂载到全局,需要开启命名空间
在这里插入图片描述

vuex中从模块中访问actions

在这里插入图片描述

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

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

相关文章

sass 生成辅助色

背景 一个按钮往往有 4 个状态。 默认状态hover鼠标按下禁用状态 为了表示这 4 个状态&#xff0c;需要设置 4 个颜色来提示用户。 按钮类型一般有 5 个&#xff1a; 以 primary 类型按钮为例&#xff0c;设置它不同状态下的颜色&#xff1a; <button class"btn…

lc307.区域和检索 - 数组可修改

暴力解法 创建方法&#xff0c;通过switch-case判断所需要调用的方法。 public class RegionsAndSertches {public static void main(String[] args) {String[] str new String[]{"NumArray", "sumRange", "update", "sumRange"};i…

互联网Java工程师面试题·微服务篇·第二弹

目录 18、什么是 Spring 引导的执行器&#xff1f; 19、什么是 Spring Cloud&#xff1f; 20、Spring Cloud 解决了哪些问题&#xff1f; 21、在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处&#xff1f; 22、你能否给出关于休息和微服务的要点&#xff1f; 23、…

c语言-assert(断言)的笔记

一、assert(断言)简介 assert的功能&#xff0c;条件为真&#xff0c;程序继续执行&#xff1b;如果断言为假&#xff08;false&#xff09;&#xff0c;则程序终止。 assert是个宏定义&#xff01; 头文件&#xff1a; #include <assert.h> 原型&#xff1a; void asser…

nacos适配达梦数据库

一、下载源码 源码我直接下载gitee上nacos2.2.3的&#xff0c;具体链接&#xff1a;https://gitee.com/mirrors/Nacos/tree/2.2.3&#xff0c;具体如下图&#xff1a; 二、集成达梦数据库驱动 解压源码包&#xff0c;用idea打开源码&#xff0c;等idea和maven编译完成&#xff…

HarmonyOS开发(三):ArkTS基础

1、ArkTS演进 Mozilla创建了JS ---> Microsoft创建了TS ----> Huawei进一步推出ArkTS 从最初的基础逻辑交互&#xff08;JS&#xff09;,到具备类型系统的高效工程开发&#xff08;TS&#xff09;,再到融合声明式UI、多维状态管理等丰富的应用开发能力&…

SDL2 播放视频数据(YUV420P)

1.简介 这里以常用的视频原始数据YUV420P为例&#xff0c;展示视频的播放。 SDL播放视频的流程如下&#xff1a; 初始化SDL&#xff1a;SDL_Init();创建窗口&#xff1a;SDL_CreateWindow();创建渲染器&#xff1a;SDL_CreateRenderer();创建纹理&#xff1a;SDL_CreateText…

ESP32 Arduino引脚分配参考:您应该使用哪些 GPIO 引脚?

ESP32 芯片有 48 个引脚&#xff0c;具有多种功能。并非所有 ESP32 开发板中的所有引脚都暴露出来&#xff0c;有些引脚无法使用。 关于如何使用 ESP32 GPIO 有很多问题。您应该使用什么引脚&#xff1f;您应该避免在项目中使用哪些引脚&#xff1f;这篇文章旨在成为 ESP32 GP…

Spark3.0中的AOE、DPP和Hint增强

1 Spark3.0 AQE Spark 在 3.0 版本推出了 AQE&#xff08;Adaptive Query Execution&#xff09;&#xff0c;即自适应查询执行。AQE 是 Spark SQL 的一种动态优化机制&#xff0c;在运行时&#xff0c;每当 Shuffle Map 阶段执行完毕&#xff0c;AQE 都会结合这个阶段的统计信…

Machine-Level Programming III:Procedure

Machine-Level Programming III:Procedure Today Procedures Mechanisms(机制)Stack StructureCalling Conventions(调用规则) Passing control(传递控制)Passing data(传递数据)Managing local data Illustration of Recursion(递归说明) 补充术语&#xff1a; Program 程序…

Spring后端HttpClient实现微信小程序登录

这是微信官方提供的时序图。我们需要关注的是前后端的交互&#xff0c;以及服务端如何收发网络请求。 小程序端 封装基本网络请求 我们先封装一个基本的网络请求。 const baseUrl"localhost:8080" export default{sendRequsetAsync } /* e url&#xff1a;目标页…

【ARM Trace32(劳特巴赫) 使用介绍 4 - Trace32 Discovery 详细介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1 SYS.Detect1.2 AHBAPn/AXIAPnAPBAPn.Base1.1 SYS.Detect 在 TRACE32 中, SYS.Detect 是一个用来检测目标系统配置的命令。 当你执行 SYS.Detect DAP 命令时,TRACE32 将自动检测和识别目标系统上的 ARM De…

python爬虫代理ip关于设置proxies的问题

目录 前言 一、什么是代理IP? 二、为什么需要设置代理IP? 三、如何设置代理IP? 四、完整代码 总结 前言 在进行Python爬虫开发时&#xff0c;经常会遇到被封IP或者频繁访问同一网站被限制访问等问题&#xff0c;这时&#xff0c;使用代理IP就可以避免这些问题&#x…

CSS特效008:鼠标悬浮文字跳动动画效果

总第 010 篇文章&#xff0c; 查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花…

【算法与数据结构】78、90、LeetCode子集I, II

文章目录 一、题目二、78.子集三、90.子集II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、78.子集 思路分析&#xff1a;【算法与数据结构】77、LeetCode组合。本题可以参考77题的组合问题代码&#xff0…

路由器的结构以及工作原理

目录 路由器的结构 交换结构三种常用的交换方式 1.通过存储器 2.通过总线 3.通过纵横交换结构&#xff08;crossbar switch fabric&#xff09; 路由器的结构 路由器结构可划分为两大部分&#xff1a;路由选择部分&#xff0c;分组转发部分 路由选择部分也叫做控制部分&…

java高并发系列-第2天:并发级别

这是java高并发系列第2篇文章&#xff0c;一个月&#xff0c;咱们一起啃下java高并发&#xff0c;欢迎留言打卡&#xff0c;一起坚持一个月&#xff0c;拿下java高并发。 由于临界区的存在&#xff0c;多线程之间的并发必须受到控制。根据控制并发的策略&#xff0c;我们可以把…

P6入门:项目初始化7-项目详情之代码/分类码Code

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

排序算法之-快速

算法原理 丛待排序的数列中选择一个基准值&#xff0c;通过遍历数列&#xff0c;将数列分成两个子数列&#xff1a;小于基准值数列、大于基准值数列&#xff0c;准确来说还有个子数列&#xff1a;等于基准值即&#xff1a; 算法图解 选出基准元素pivot&#xff08;可以选择…

P36[11-1]SPI通信协议

SPI相比于IIC的优缺点: 1.SPI传输速度快(IIC高电平驱动能力较弱,因此无法高速传输) 2.使用简单 3.通信线多 SCK(SCLK,CK,CLK):串行时钟线 MOSI(DO):主机输出,从机输入 MISO(DI): 主机输入,从机输出 SS(NSS,CS):从机选择(有多少个从机,主机就要用几根SS分别与从机连接…