【Vue3+Vite】Vue3视图渲染技术 快速学习 第二期

文章目录

  • 一、模版语法
    • 1.1 插值表达式和文本渲染
      • 1.1.1 插值表达式 语法
      • 1.1.2 文本渲染 语法
    • 1.2 Attribute属性渲染
    • 1.3 事件的绑定
  • 二、响应式基础
    • 2.1 响应式需求案例
    • 2.2 响应式实现关键字ref
    • 2.3 响应式实现关键字reactive
    • 2.4 扩展响应式关键字toRefs 和 toRef
  • 三、条件和列表渲染
    • 3.1 条件渲染
    • 3.2 列表渲染
  • 四、双向绑定
  • 五、数据监听器


一、模版语法

  • Vue 使用一种基于 HTML模板语法,使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。
  • 所有的 Vue 模板都是语法层面合法的 HTML,可以被符合规范的浏览器和 HTML 解析器解析。
  • 在底层机制中,Vue 会将模板编译成高度优化的 JavaScript 代码。
  • 结合响应式系统,当应用状态变更时,Vue 能够智能地推导出需要重新渲染的组件的最少数量,并应用最少的 DOM 操作

1.1 插值表达式和文本渲染

插值表达式:最基本的数据绑定形式是文本插值,它使用的是“Mustache”语法 ,即双大括号{{}}

  • 插值表达式是将数据渲染元素的指定位置的手段之一
  • 插值表达式不绝对依赖标签,其位置相对自由
  • 插值表达式中支持javascript的运算表达式
  • 插值表达式中也支持函数的调用

1.1.1 插值表达式 语法

{{数据名字/函数/对象调用API}}

<script setup>
let msg = "hello";

let getMsg = () => {
  return "hello vue3 message";
};

let age = 25;
let nickname = "道格";

// 对象调用API
// 模拟购物车:
const carts = [
  { name: "可乐", price: 3, number: 10 },
  { name: "百事", price: 2, number: 20 }
];
//购物车计算: 总价 = 单价*个数
function compute() {
  let count = 0;
  for (const index in carts) {
    count += carts[index].price * carts[index].number;
  }
  return count;
}
</script>

<template>
  <div>
    msg: {{msg}}
    <br />
    getMsg : {{getMsg()}}
    <br />
    age : {{age}}
    <br />
    nickname : {{nickname}}
    <br />
    购物总价:{{compute()}}
    <br />
    表达式写计算购物总价: {{carts[0].price*carts[0].number + carts[1].price * carts[1].number}}
  </div>
</template>

<style scoped>
</style>

result

1.1.2 文本渲染 语法

为了渲染双标中的文本,我们也可以选择使用v-textv-html命令

  • v-*** 这种写法的方式使用的是vue的命令
  • v-***的命令必须依赖元素,并且要写在元素的开始标签
  • v-***指令支持ES6中的字符串模板
  • 插值表达式中支持javascript的运算表达式
  • 插值表达式中也支持函数的调用
  • v-text可以将数据渲染成双标签中间的文本,但是不识别html元素结构的文本
  • v-html可以将数据渲染成双标签中间的文本,识别html元素结构的文本
<script setup>
let msg = "hello";

let getMsg = () => {
  return msg + " getMsg";
};

let refMsg = "<font color='red'>msg</font>";
let greenMsg = `<font color=\'green\'>${msg}</font>`;
</script>

<template>
  <div>
    <span v-text="msg"></span>
    <br />
    <span v-text="getMsg()"></span>
    <br />
    <span v-text="refMsg"></span>
    <br />
    <span v-html="refMsg"></span>
    <br />
    <span v-html="greenMsg"></span>
  </div>
</template>

<style scoped>
</style>

2

1.2 Attribute属性渲染

想要渲染一个元素的 attribute,应该使用 v-bind指令

  • 由于插值表达式不能直接放在标签的属性中,所有要渲染元素的属性就应该使用v-bind
  • v-bind可以用于渲染任何元素的属性,语法为 v-bind:属性名='数据名', 可以简写为 :属性名='数据名'
<script setup>
const data = {
  name: "道格维克",
  url: "https://blog.csdn.net/GavinGroves",
  image: "https://www.runoob.com/wp-content/uploads/2017/01/vue.png"
};
</script>

<template>
  <div>
  						<!--target="_blan" 跳转页面 _self当前页面变化 -->
    <a v-bind:href="data.url" target="_self">
      <img :src="data.image" :title="data.name" />
      <br />
      <input type="button" :value="`点击访问${data.name}`" />
    </a>
  </div>
</template>

<style scoped>
</style>

vue

1.3 事件的绑定

v-on 来监听 DOM 事件,并在事件触发时执行对应 Vue的JavaScript代码

  • 用法:v-on:click="handler" 或简写为 @click="handler"
  • vue中的事件名=原生事件名去掉on 前缀 如:onClick --> click
  • handler的值可以是方法事件处理器,也可以是内联事件处理器
  • 绑定事件时,可以通过一些绑定的修饰符,常见的事件修饰符如下
    • .once:只触发一次事件。
    • .prevent:阻止默认事件。
    • .stop:阻止事件冒泡。
    • .capture:使用事件捕获模式而不是冒泡模式。
    • .self:只在事件发送者自身触发时才触发事件。
<script setup>
import { ref } from "vue";

function fun1() {
  alert("你好");
}
// 计数器:
let count = ref(0);
function counter() {
  count.value++;
}

function jumpDeterPrevent() {
  alert("不许访问!");
}

function jumpDeter(event) {
  let isFlag = confirm("确定要访问吗?");
  if (!isFlag) {
    event.preventDefault();
  }
}
</script>

<template>
  <div>
    <!-- 事件的绑定函数 脸两种写法 -->
    <button v-on:click="fun1">按钮1</button>
    <br />
    <button @click="fun1">按钮2</button>
    <br />
    <!-- 内联事件处理器 -->
    <button @click="counter">{{count}}</button>
    <!-- 事件修饰符 once 只能执行一次-->
    <button @click.once="counter">加一次</button>
    {{count}}
    <br />
    <!-- 事件修饰符 prevent 阻止组件的默认行为 -->
    <a
      href="https://blog.csdn.net/GavinGroves"
      target="_blank"
      @click.prevent="jumpDeterPrevent()"
    >prevent阻止跳转页面</a>
    <br />
    <!-- 原生js方式阻止组件默认行为 (推荐) -->
    <a
      href="https://blog.csdn.net/GavinGroves"
      target="_blank"
      @click="jumpDeter($event)"
    >JS原生阻止跳转页面</a>
  </div>
</template>
<style scoped>
</style>

result

二、响应式基础

此处的响应式是指 :

  • 数据模型发生变化时,自动更新DOM树内容,页面上显示的内容会进行同步变化,
  • vue3的数据模型不是自动响应式的,需要我们做一些特殊的处理

2.1 响应式需求案例

需求:实现 + - 按钮,实现数字加一减一
这个案例中 数值是会变的 但是页面上不会实时更新
Vue3中 需要用vue 提供的ref reactive 关键字

案例参考:
【Vue3 + Vite】Vite搭建 项目解构 Vue快速学习 第一期

2.2 响应式实现关键字ref

ref 可以将一个基本类型的数据(如字符串,数字等)转换为一个响应式对象。
ref 只能包裹单一元素

    /* 从vue中引入ref方法 */
    import {ref} from 'vue'
    let counter = ref(0);

数据变化,视图也会跟着动态更新。
需要注意的是,由于使用了 ref,因此需要在访问该对象时使用 .value 来获取其实际值。

2.3 响应式实现关键字reactive

reactive() 函数创建一个响应式对象或数组:

<script setup>
/* 从vue中引入reactive方法 */
import { ref, reactive } from "vue";

let person = reactive({
  name: "道格",
  age: "22"
});
/* 函数中要操作reactive处理过的数据,需要通过 对象名.属性名的方式 */
function changeAge() {
  person.age++;
}

function showAge() {
  alert(person.age);
}
</script>

<template>
  <div>
    <button @click="changeAge()">{{person.age}}</button>
    <button @click="showAge()">showAge</button>
  </div>
</template>

<style scoped>
</style>

对比ref和reactive :

  • ref 函数 适用场景:

    • 更适合单个变量
    • 需要通过 .value 访问其实际值
  • reactive函数 适用场景:

    • 更适合对象
    • reactive 可以将一个普通对象转化为响应式对象,这样在数据变化时会自动更新界面,特别适用于处理复杂对象或者数据结构。
    • 使用 reactive 可以递归追踪所有响应式对象内部的变化,从而保证界面的自动更新

综上所述:

  • ref 适用与简单情形下的数据双向绑定,对于只有一个字符等基本类型数据或自定义组件等情况,建议可以使用 ref
  • 而对于对象函数等较为复杂的数据结构,以及需要递归监听的属性变化,建议使用 reactive

2.4 扩展响应式关键字toRefs 和 toRef

  • toRef函数
    • 将一个reactive响应式对象中的某个属性转换成一个ref响应式对象
    • 每个单独的 ref 都是使用 toRef() 创建的。
  • toRefs函数:
    - 将一个reactive响应式对象中的多个属性转换成多个ref响应式对象

案例:响应显示reactive对象属性

<script type="module" setup>
    /* 从vue中引入reactive方法 */
    import {ref,reactive,toRef,toRefs} from 'vue'
    let data = reactive({
      counter:0,
      name:"test"
    })

    // 将一个reactive响应式对象中的某个属性转换成一个ref响应式对象
    let ct =toRef(data,'counter');
    // 将一个reactive响应式对象中的多个属性转换成多个ref响应式对象
    let {counter,name} = toRefs(data)

    function show(){
        alert(data.counter);
        // 获取ref的响应对象,需要通过.value属性
        alert(counter.value);
        alert(name.value)
    }
    /* 函数中要操作ref处理过的数据,需要通过.value形式 */
    let decr = () =>{
      data.counter--;
    }
    let incr = () =>{
      /* ref响应式数据,要通过.value属性访问 */
      counter.value++;
    }
</script>

<template>
  <div>
    <button @click="data.counter--">-</button> 
    <button @click="decr()">-</button> 
    {{ data.counter }} 
    &amp;
    {{ ct }} 
    <button @click="data.counter++">+</button>
    <button @click="incr()">+</button> 
    <hr>
    <button @click="show()">显示counter值</button>
   </div>
</template> 
<style scoped>
</style>

三、条件和列表渲染

3.1 条件渲染

v-if 条件渲染

  • v-if='表达式' 只会在指令的表达式返回真值时才被渲染
  • 也可以使用 v-elsev-if 添加一个“else 区块”。
  • 一个 v-else 元素必须跟在一个 v-if 元素后面,否则它将不会被识别。
<script setup>
/* 从vue中引入reactive方法 */
import { ref, reactive } from "vue";

let awesome = ref(true);
</script>

<template>
  <div>
    <h1 v-if="awesome">Vue is awesome!</h1>
    <h1 v-else>Oh no !</h1>
    <button @click="awesome = !awesome">Toggle</button>
  </div>
</template>

<style scoped>
</style>

在这里插入图片描述

v-show条件渲染扩展:

  • 另一个可以用来按条件显示一个元素的指令是 v-show。其用法基本一样.

  • 不同之处在于 v-show 会在 DOM 渲染中保留该元素;v-show 仅切换了该元素上名为 display 的 CSS 属性。

  • v-show 不支持在 <template> 元素上使用,也不能和 v-else 搭配使用。

<script setup>
/* 从vue中引入reactive方法 */
import { ref, reactive } from "vue";
let awesome = ref(true);
</script>
<template>
  <div>
    <h1 id="ha" v-show="awesome">Vue is awesome!</h1>
    <button @click="awesome = !awesome">Toggle</button>
  </div>
</template>
<style scoped>
</style>

在这里插入图片描述

v-show 就是通过style隐藏样式
只是需要隐藏/显示 频繁切换可以用 v-show

v-if vs v-show

  • v-if 是“真实的”按条件渲染,因为它确保了在切换时,条件区块内的事件监听器和子组件都会被销毁与重建。

  • v-if 也是惰性的:如果在初次渲染时条件值为 false,则不会做任何事。条件区块只有当条件首次变为 true 时才被渲染。

  • 相比之下,v-show 简单许多,元素无论初始条件如何,始终会被渲染,只有 CSS display 属性会被切换。

  • 总的来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要频繁切换,则使用 v-show 较好;如果在运行时绑定条件很少改变,则 v-if 会更合适。

3.2 列表渲染

使用 v-for 指令基于一个数组来渲染一个列表。

  • v-for 指令的值需要使用 item in items 形式的特殊语法,其中 items 是源数据的数组,而 item 是迭代项的别名

  • v-for 块中可以完整地访问父作用域内的属性和变量。v-for 也支持使用可选的第二个参数表示当前项的位置索引。

<script setup>
/* 从vue中引入reactive方法 */
import { ref, reactive } from "vue";
let parentMessage = ref("产品");
let items = reactive([
  { id: "item1", message: "可乐" },
  { id: "item2", message: "百事" }
]);
</script>

<template>
  <div>
    <ul>
      <li v-for="item in items" :key="item.id">{{item.message}}</li>
    </ul>

    <ul>
      <!-- index表示索引 -->
      <li
        v-for="(item, index) in items"
        :key="index"
      >{{ parentMessage }} - {{ index }} - {{ item.message }}</li>
    </ul>
  </div>
</template>

<style scoped>
</style>

2

  • 案例:实现购物车显示和删除购物项
<script type="module" setup>
//引入模块
import { reactive } from "vue";
//准备购物车数据,设置成响应数据
const carts = reactive([
  { id: "item1", name: "可乐", price: 3, number: 5 },
  { id: "item2", name: "百事", price: 2, number: 10 }
]);
//计算购物车总金额
function counter() {
  let count = 0;
  for (let index in carts) {
    count += carts[index].price * carts[index].number;
  }
  return count;
}
//删除购物项方法
function removeThing(index) {
  carts.splice(index, 1);
}
</script>

<template>
  <div>
    <table>
      <thead>
        <th>序号</th>
        <th>商品名</th>
        <th>价格</th>
        <th>数量</th>
        <th>小计</th>
        <th>操作</th>
      </thead>
      <tbody v-if="carts.length > 0">
        <tr v-for="(item,index) in carts" :key="index">
          <td>{{index+1}}</td>
          <td>{{item.name}}</td>
          <td>{{item.price}}</td>
          <td>{{item.number}}</td>
          <td>{{item.price * item.number + '元'}}</td>
          <td>
            <button @click="removeThing(index)">删除</button>
          </td>
        </tr>
      </tbody>
      <tbody v-else>
        <!-- 没有数据显示-->
        <tr>
          <td colspan="6">购物车没有数据!</td>
        </tr>
      </tbody>
    </table>
    购物车总金额:{{counter()}} 元
  </div>
</template> 

<style scoped>
</style>

2

四、双向绑定

单项绑定和双向绑定

  • 单向绑定: 响应式数据 会影响 页面显示DOM的数据,反过来用户在页面上的操作不会影响响应式数据。
    • (script中设置数值,HTML显示,HTML里改变数据不影响script中数值)
  • 双向绑定: 响应式数据 会 影响页面 ,反过来 页面数据的变化 也会影响响应式数据
    • (script设置数据,HTML显示的同时也能反向改变script里的数值)
    • 用户通过表单标签才能够输入数据,所以双向绑定都是应用到表单标签上的,其他标签不行
    • v-model专门用于双向绑定表单标签的value属性,语法为 v-model:value='',可以简写为 v-model=''
    • v-model还可以用于各种不同类型的输入,<textarea><select> 元素。

代码演示:

<script type="module" setup>
//引入模块
import { ref, reactive } from "vue";

let hobbys = ref([]);
let user = reactive({
  username: null,
  pwd: null,
  introduce: null,
  address: null
});

// 清空全部已填数据
function clearAll() {
  user.username = "";
  user.pwd = "";
  user.introduce = "";
  user.address = "";
  //ref要用value
  hobbys.value.splice(0, hobbys.value.length);
}
</script>

<template>
  <div>
    账号:
    <input type="text" placeholder="请输入账号!" v-model="user.username" />
    <br />密码:
    <input type="password" placeholder="请输入密码!" v-model="user.pwd" />
    <br />
    <textarea v-model="user.introduce"></textarea>
    <br />地址:
    <select v-model="user.address">
      <option value="1"></option>
      <option value="2"></option>
      <option value="3"></option>
    </select>
    <br />爱好:
    <input type="checkbox" name="hbs" v-model="hobbys" value="Java" />
    <input type="checkbox" name="hbs" v-model="hobbys" value="C#" />
    <input type="checkbox" name="hbs" v-model="hobbys" value="Python" />
    <input type="checkbox" name="hbs" v-model="hobbys" value="C++" />
    {{hobbys}}
    <br />
    显示user数据: {{user}}
    <br />
    <button @click="clearAll()">清空已填数据</button>
  </div>
</template> 

<style scoped>
</style>

数据显示:
result
数据清空:
All

五、数据监听器

使用 watch 函数在每次响应式状态发生变化时触发回调函数:

watch主要用于以下场景:

  • 当数据发生变化时需要执行相应的操作
  • 监听数据变化,当满足一定条件时触发相应操作
  • 在异步操作前或操作后需要执行相应的操作

监控响应式数据(watch):

<script type="module" setup>
  //引入模块
  import { ref,reactive,watch} from 'vue'
 
  let firstname=ref('')
  let lastname=reactive({name:''})
  let fullname=ref('')

  //监听一个ref响应式数据
  watch(firstname,(newValue,oldValue)=>{
    console.log(`${oldValue}变为${newValue}`)
    fullname.value=firstname.value+lastname.name
  })
  //监听reactive响应式数据的指定属性
  watch(()=>lastname.name,(newValue,oldValue)=>{
    console.log(`${oldValue}变为${newValue}`)
    fullname.value=firstname.value+lastname.name
  })
  //监听reactive响应式数据的所有属性(深度监视,一般不推荐)
  //deep:true 深度监视
  //immediate:true 深度监视在进入页面时立即执行一次
  watch(()=>lastname,(newValue,oldValue)=>{
    // 此时的newValue和oldValue一样,都是lastname
    console.log(newValue)
    console.log(oldValue)
    fullname.value=firstname.value+lastname.name
  },{deep:true,immediate:false})
</script>

<template>
  <div>
    全名:{{fullname}} <br>
    姓氏:<input type="text" v-model="firstname"> <br>
    名字:<input type="text" v-model="lastname.name" > <br>
  </div>
</template> 

<style scoped>
</style>

监控响应式数据(watchEffect):

  • watchEffect默认监听所有的响应式数据
<script type="module" setup>
  //引入模块
  import { ref,reactive,watch, watchEffect} from 'vue'
 
  let firstname=ref('')
  let lastname=reactive({name:''})
  let fullname=ref('')

  //监听所有响应式数据
  watchEffect(()=>{
    //直接在内部使用监听属性即可!不用外部声明
    //也不需要,即时回调设置!默认初始化就加载!
    console.log(firstname.value)
    console.log(lastname.name)
    fullname.value=`${firstname.value}${lastname.name}`
  })
</script>

<template>
  <div>
    全名:{{fullname}} <br>
    姓氏:<input type="text" v-model="firstname"> <br>
    名字:<input type="text" v-model="lastname.name" > <br>
  </div>
</template> 

<style scoped>
</style>

watch vs. watchEffect

watchwatchEffect 都能响应式地执行有副作用的回调。它们之间的主要区别是追踪响应式依赖的方式:

  • watch 只追踪明确侦听的数据源。它不会追踪任何在回调中访问到的东西。另外,仅在数据源确实改变时才会触发回调。watch 会避免在发生副作用时追踪依赖,因此,我们能更加精确地控制回调函数的触发时机。
  • watchEffect,则会在副作用发生期间追踪依赖。它会在同步执行过程中,自动追踪所有能访问到的响应式属性。这更方便,而且代码往往更简洁,但有时其响应性依赖关系会不那么明确。

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

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

相关文章

农业植保无人机行业研究:预计2025年市场规模可达115亿元

农业植保无人机行业市场投资前景现状如何?农业植保无人机市场&#xff0c;包括无人机自身技术、性能标准和植保标准。农业植保无人机应用植保机喷洒农药对我国而言&#xff0c;不仅具有很大的经济价值&#xff0c;还具有社会价值&#xff1a;农业植保机作业不仅有超高的工作效…

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献&#xff1a;《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心 一、独立中线模块的三相四线拓扑 独立中线模块是控制中线电压恒为母线一半&#xff0c;同时为零序电流ineu提供通路。不平衡负载的零序电流会导致中线电压脉动&#xff0c;因此需要控制…

【Android 字节码插桩】Gradle插件基础 Transform API的使用

前言 啪~我给大家开个会&#xff08;手机扔桌子上&#xff09; 什么叫做 客户无感的数据脱敏&#xff01;&#xff1f; 师爷给翻译翻译什么叫做客户无感的数据脱敏&#xff1f; 什么特么的叫做客户无感数据脱敏&#xff1f; 举个栗子~ 客户端Sdk新升级了一个版本&#xff0c;增…

UnityShader(九)Unity中的基础光照(下)

目录 标准光照模型 自发光 高光反射 &#xff08;1&#xff09;Phong模型 &#xff08;2&#xff09;Blinn模型 漫反射 环境光 逐顶点还是逐像素 逐像素光照 逐顶点光照 总结 标准光照模型 光照模型有许多种&#xff0c;但在早期游戏引擎中&#xff0c;往往只使用一…

linux -- 并发 -- 并发来源与简单的解决并发的手段

互斥与同步 当多个执行路径并发执行时&#xff0c;确保对共享资源的访问安全是驱动程序员不得不面对的问题 互斥&#xff1a;对资源的排他性访问 同步&#xff1a;对进程执行的先后顺序做出妥善的安排 一些概念&#xff1a; 临界区&#xff1a;对共享的资源进行访问的代码片段…

1、缓存击穿背后的问题

当面试官问&#xff1a;你知道什么是缓存击穿吗&#xff0c;你们是如何解决的&#xff1f; 首先我们要了解什么是缓存击穿&#xff1f;以及缓存击穿会引发什么问题&#xff1f; 缓存击穿就是redis中的热点数据过期&#xff0c;缓存失效&#xff0c;导致大量的请求直接打到数据…

【免费分享】数据可视化-银行动态实时大屏监管系统,含源码

一、动态效果展示 1. 动态实时更新数据效果图 ​ 2. 鼠标右键切换主题 二、确定需求方案 1. 屏幕分辨率 这个案例的分辨率是16:9&#xff0c;最常用的的宽屏比。 根据电脑分辨率屏幕自适应显示&#xff0c;F11全屏查看&#xff1b; 2. 部署方式 B/S方式&#xff1a;支持…

使用了不受支持的协议。 ERR_SSL_VERSION_OR_CIPHER_MISMATCH的问题解决办法

windwos 2008 R2 使用IIS部署的项目申请使用https协议的时候&#xff0c;通过安全加密协议访问网站提示不受支持的协议 错误原因分析 这种错误通常表示客户端和服务器之间存在协议版本或加密套件不兼容导致在SSL&#xff08;Secure Socket Layer&#xff09; 1.协议版本不兼容&…

壹[1],Xamarin开发环境配置

1&#xff0c;环境 VS2022 注&#xff1a; 1&#xff0c;本来计划使用AndroidStudio&#xff0c;但是也是一堆莫名的配置让人搞得很神伤&#xff0c;还是回归C#。 2&#xff0c;MAUI操作类似&#xff0c;但是很多错误解来解去&#xff0c;且调试起来很卡。 3&#xff0c;最…

哪个牌子的头戴式耳机好?推荐性价比高的头戴式耳机品牌

随着科技的不断发展&#xff0c;耳机市场也呈现出百花齐放的态势&#xff0c;从高端的奢侈品牌到亲民的平价品牌&#xff0c;各种款式、功能的耳机层出不穷&#xff0c;而头戴式耳机作为其中的一员&#xff0c;凭借其优秀的音质和降噪功能&#xff0c;受到了广大用户的喜爱&…

C++文件操作(2)

文件操作&#xff08;2&#xff09; 1.二进制模式读取文本文件2.使用二进制读写其他类型内容3.fstream类4.文件的随机存取文件指针的获取文件指针的移动 1.二进制模式读取文本文件 用二进制方式打开文本存储的文件时&#xff0c;也可以读取其中的内容&#xff0c;因为文本文件…

Flask 入门3:Flask 请求上下文与请求

1. 前言 Flask 在处理请求与响应的过程&#xff1a; 首先我们从浏览器发送一个请求到服务端&#xff0c;由 Flask 接收了这个请求以后&#xff0c;这个请求将会由路由系统接收。然后在路由系统中&#xff0c;还可以挂入一些 “勾子”&#xff0c;在进入我们的 viewFunction …

【C++】开源:Windows图形库EasyX配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Windows图形库EasyX配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#…

✅Redis 常见数据类型和应用场景(详解)

Redis 提供了丰富的数据类型&#xff0c;常见的有五种&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff0c;Set&#xff08;集合&#xff09;、Zset&#xff08;有序集合&…

揭开时间序列的神秘面纱:特征工程的力量

目录 写在开头1. 什么是特征工程?1.1 特征工程的定义和基本概念1.2 特征工程在传统机器学习中的应用1.3 时间序列领域中特征工程的独特挑战和需求3. 时间序列数据的特征工程技术2.1 数据清洗和预处理2.1.1 缺失值处理2.1.2 异常值检测与处理2.2 时间特征的提取2.2.1 时间戳解析…

循环——枚举算法2(c++)

目录 找和为K的两个元素 描述 在一个长度为n(n < 1000)的整数序列中&#xff0c;判断是否存在某两个元素之和为k。 输入 第一行输入序列的长度n和k&#xff0c;用空格分开。 第二行输入序列中的n个整数&#xff0c;用空格分开。 输出 如果存在某两个元素的和为k&…

个人建站前端篇(一)项目准备初始化以及远程仓库连接

云风的知识库 云风网前端重构&#xff0c;采用vue3.0vite antd框架&#xff0c;实现前后端分离&#xff0c;实现网站的SEO优化&#xff0c;实现网站的性能优化 vite创建vue项目以及前期准备 Vite 需要 Node.js 版本 18&#xff0c;20。然而&#xff0c;有些模板需要依赖更高…

STM32存储左右互搏 QSPI总线读写FLASH W25QXX

STM32存储左右互搏 QSPI总线读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库Qual SPI总线操作W25Q各型号FLASH的例程。 W25Q…

游泳耳机要怎么选购?一篇文章告诉你如何选购游泳耳机

在进行运动时享受音乐的乐趣是许多人的喜好&#xff0c;对于在地面展开的一般运动&#xff0c;选择耳机相对简单&#xff0c;但若是涉及水中游泳&#xff0c;我们就需要一款具备防水性能的专业游泳耳机。市面上已有数款针对游泳设计的防水耳机&#xff0c;本文将为您详细介绍如…

【解刊】审稿人极其友好!中科院2区SCI,3个月录用,论文质量要求宽松!

计算机类 • 高分快刊 今天带来Springer旗下计算机领域高分快刊&#xff0c;有投稿经验作者表示期刊审稿人非常友好&#xff0c;具体情况一起来看看下文解析。如有投稿意向可重点关注&#xff1a; 01 期刊简介 Complex & Intelligent Systems ✅出版社&#xff1a;Sprin…