Vue3的核心语法【未完】

news2025/3/6 2:58:55

Vue3的核心语法

OptionsAPI与CompositionAPI

Options API(选项式) 和 Composition API (组合式)是 Vue.js 中用于构建组件的两种不同方式。Options API

Options API

Options API 是 Vue 2 中的传统模式,并在 Vue 3 中继续得到支持。它通过在组件定义中使用选项(如 datamethodscomputed 等)来组织代码,选项所定义的属性都会暴露在函数内部的 this 上,它会指向当前的组件实例

Composition API

Composition API 是 Vue 3 引入的新特性,允许开发者以函数的形式编写可重用的逻辑片段,并将这些片段组合在一起。

对比

特性Options APIComposition API
代码组织方式分散在 datamethodscomputed 等选项中使用 setup 函数,相关逻辑集中
复用性较差,逻辑分散较好,逻辑封装为函数,便于复用
维护性随着组件复杂度增加,维护难度增大代码集中,维护方便
学习难度更直观,易于上手学习曲线较陡
适用场景小型项目、新手大型项目、需要复用逻辑的

拉开序幕的setup

在 Vue 3 中,setup 函数是 Composition API 的核心入口,用于替代 Options API 中的 datamethodscomputed 等选项。它在组件实例化之前执行,允许开发者以更灵活和模块化的方式组织组件逻辑。

setup 函数的作用

  1. 声明响应式状态
    使用 refreactive 创建响应式数据,这些数据可以在模板中直接使用。

    import { ref } from 'vue';
    export default {
      setup() {
        const count = ref(0);
        return { count };
      }
    };
    
  2. 定义计算属性和侦听器
    使用 computedwatch 来创建计算属性和侦听器,从而实现更灵活的状态管理。

    import { ref, computed, watch } from 'vue';
    export default {
      setup() {
        const count = ref(0);
        const doubleCount = computed(() => count.value * 2);
        watch(count, (newVal, oldVal) => {
          console.log(`count changed from ${oldVal} to ${newVal}`);
        });
        return { count, doubleCount };
      }
    };
    
  3. 定义方法
    setup 中定义方法,并在模板中调用这些方法。

    export default {
      setup() {
        const count = ref(0);
        const increment = () => { count.value++; };
        return { count, increment };
      }
    };
    
  4. 使用生命周期钩子
    虽然 setup 本身不是生命周期钩子,但可以在其中访问生命周期钩子函数(如 onMountedonUnmounted 等)。

    import { onMounted } from 'vue';
    export default {
      setup() {
        onMounted(() => {
          console.log('Component is mounted!');
        });
      }
    };
    
  5. 逻辑复用和组合
    通过自定义的组合函数(Composables),可以封装特定逻辑,并在多个组件中复用。

    // useCounter.js
    import { ref } from 'vue';
    export function useCounter() {
      const count = ref(0);
      const increment = () => { count.value++; };
      return { count, increment };
    }
    
    // MyComponent.vue
    import { useCounter } from './useCounter';
    export default {
      setup() {
        const { count, increment } = useCounter();
        return { count, increment };
      }
    };
    
  6. 与 Options API 的兼容性
    虽然 setup 是 Vue 3 的新特性,但它可以与 Options API 共存。不过,为了保持代码的一致性,建议选择一种方式并坚持使用。

setup 函数的参数

setup 函数可以接收两个参数:propscontext

  • props:包含传递给组件的所有属性,是响应式的,不能直接解构。
  • context:包含 attrsslotsemit,分别对应未声明为 props 的属性、插槽内容和自定义事件。

示例

以下是一个更复杂的示例,展示如何在 setup 中综合使用响应式数据、计算属性、侦听器和生命周期钩子。

<template>
  <div>
    <h1>{{ message }}</h1>
    <p>Count: {{ count }}</p>
    <p>Double Count: {{ doubleCount }}</p>
    <button @click="increment">Increment</button>
    <button @click="resetCount">Reset Count</button>
  </div>
</template>

<script>
import { ref, computed, watch, onMounted, onUnmounted } from 'vue';

export default {
  props: {
    message: String
  },
  setup(props) {
    // 响应式数据
    const count = ref(0);

    // 计算属性
    const doubleCount = computed(() => count.value * 2);

    // 方法
    const increment = () => {
      count.value++;
    };

    const resetCount = () => {
      count.value = 0;
    };

    // 侦听器
    watch(count, (newVal, oldVal) => {
      console.log(`Count changed from ${oldVal} to ${newVal}`);
    });

    // 生命周期钩子
    onMounted(() => {
      console.log('Component is mounted!');
    });

    onUnmounted(() => {
      console.log('Component is unmounted!');
    });

    // 返回对象,暴露给模板
    return {
      message: props.message,
      count,
      doubleCount,
      increment,
      resetCount
    };
  }
};
</script>
  1. 响应式数据count 是通过 ref 创建的响应式数据。
  2. 计算属性doubleCount 是基于 count 的计算属性。
  3. 方法incrementresetCount 是定义的操作方法。
  4. 侦听器:通过 watch 监听 count 的变化,并在控制台输出变化信息。
  5. 生命周期钩子:在组件挂载和卸载时分别输出日志。
  6. 返回值setup 返回的对象包含所有需要在模板中使用的数据和方法。

setup语法糖

setup 语法糖是 Vue 3 提供的一种更简洁的 setup 使用方式。它允许你直接在组件中使用 propscontext,而无需手动解构。

使用场景

  • 简化 props 的声明和使用
  • 简化 context 的访问
  • 与 TypeScript 的更好集成
基本用法
<script setup>    //关键
import { ref } from 'vue';

const count = ref(0);
const increment = () => count.value++;
</script>

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

在上面的例子中,<script setup>setup 语法糖的关键。它允许你在 <script> 标签中直接编写逻辑代码,而无需手动定义 setup 函数。

2. 声明 props

setup 语法糖中,props 可以直接在 <script> 标签中声明,而无需手动解构。

<script setup>
import { ref } from 'vue';

const props = defineProps({
  title: String,
  initialCount: {
    type: Number,
    default: 0
  }
});

const count = ref(props.initialCount);
const increment = () => count.value++;
</script>

<template>
  <div>
    <h1>{{ title }}</h1>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

3.使用emit

setup 语法糖还支持直接使用 emit,而无需手动解构 context

<script setup>
import { ref } from 'vue';

const props = defineProps({
  title: String
});
const emit = defineEmits(['update:title']);

const updateTitle = () => {
  emit('update:title', 'New Title');
};
</script>

<template>
  <div>
    <h1>{{ title }}</h1>
    <button @click="updateTitle">Update Title</button>
  </div>
</template>

4.使用 attrsslots

setup 语法糖还支持直接访问 attrsslots,而无需手动解构 context

<script setup>
import { useSlots, useAttrs } from 'vue';

const slots = useSlots();
const attrs = useAttrs();
</script>

<template>
  <div>
    <p>Slots: {{ Object.keys(slots) }}</p>
    <p>Attrs: {{ attrs }}</p>
  </div>
</template>

ref

ref 是 Composition API 的核心功能之一,用于创建响应式数据引用。它允许开发者将基本类型(如数字、字符串、布尔值)或复杂类型(如对象、数组)包装成响应式对象。

ref 基本概念

ref 是 Vue 3 提供的一个函数,用于创建一个响应式引用。它将一个值包装成一个响应式对象,该对象通过 .value 属性访问和修改其值。

import { ref } from 'vue';

const count = ref(0); // 创建一个响应式的数字
const name = ref('Vue 3'); // 创建一个响应式的字符串
const isVisible = ref(true); // 创建一个响应式的布尔值

在模板中使用 ref 时,Vue 会自动解包 .value,因此可以直接使用。

<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Name: {{ name }}</p>
    <h2>当前和为:{{ sum }}</h2>
  </div>
</template>
ref 的用法

1.基本用法:

ref 可以包装基本类型或复杂类型,但是必须通过 .value 访问和修改值。

console.log(count.value); // 输出 0
count.value++; // 修改值
console.log(count.value); // 输出 1

function changesum(){
  sum.value +=1;
}

2.响应式对象和数组
ref 也可以用于对象和数组,Vue 会自动追踪其内部属性的变化。

const user = ref({ name: 'John', age: 30 });
console.log(user.value.name); // 输出 John
user.value.age = 31; // 修改对象属性

对于数组,可以直接使用数组方法(如 pushpop)。

const tasks = ref(['学习 Vue 3']);
tasks.value.push('完成项目');

3 .响应式对象的嵌套

如果 ref 包装的是一个对象,对象内部的属性也是响应式的,但需要通过 .value 访问。

const user = ref({ name: 'John', age: 30 });
console.log(user.value.name); // 输出 John
user.value.age = 31; // 修改对象属性

注意事项:

  • 直接修改 ref.value 属性才会触发响应式更新。

reactive

reactive 是一个核心的响应式 API,用于创建响应式对象。它通过 ES6 的 Proxy 实现深层次的响应式代理,能够自动追踪对象属性的变化并触发视图更新。

基本用法

reactive 主要用于处理对象或数组类型的响应式数据。它将一个普通对象转换为响应式对象,可以直接访问和修改其属性,而无需通过 .value

示例 1:基本用法

<template>
  <div>
    <p>用户信息: {{ user.name }} - {{ user.age }}岁</p>
    <button @click="incrementAge">增加年龄</button>
  </div>
</template>

<script>
import { reactive } from 'vue';

export default {
  setup() {
    const user = reactive({
      name: '张三',
      age: 25,
    });

    const incrementAge = () => {
      user.age++; // 直接修改属性,无需使用 .value
    };

    return { user, incrementAge };
  }
};
</script>

在这个示例中,reactive 创建了一个包含用户信息的对象 user。点击按钮时,user.age 直接被修改,视图也会自动更新。

reactive 支持深层嵌套对象的响应式更新,这使得它非常适合处理复杂的数据结构。

示例 2:嵌套对象与数组

<template>
  <div>
    <p>用户信息: {{ user.name }} - {{ user.age }}岁</p>
    <p>地址: {{ user.address.city }}, {{ user.address.zip }}</p>
    <button @click="incrementAge">增加年龄</button>
    <button @click="updateAddress">更新地址</button>
  </div>
</template>

<script>
import { reactive } from 'vue';

export default {
  setup() {
    const user = reactive({
      name: '张三',
      age: 25,
      address: {
        city: '北京',
        zip: '100000'
      }
    });

    const incrementAge = () => {
      user.age++;
    };

    const updateAddress = () => {
      user.address.city = '上海';
      user.address.zip = '200000';
    };

    return { user, incrementAge, updateAddress };
  }
};
</script>

在这个示例中:

  1. user 是一个包含嵌套对象 address 的响应式对象。
  2. 修改 user.ageuser.address 的属性时,视图会自动更新。

解析

  1. 响应式原理
    reactive 使用 ES6 的 Proxy 对象实现深层次的响应式代理。它会自动拦截对对象属性的 getset 操作,从而实现依赖收集和更新触发。

reactive的弊端

ref 对比reactive

特性refreactive
适用类型基本类型(数字、字符串、布尔值),也可以用于对象和数组对象、数组
访问方式需要 .value直接访问
深度响应式不支持支持
性能轻量级,适合简单数据深度响应式,适合复杂数据
使用场景简单数据、计数器、DOM 引用复杂对象、表单数据、状态管理

toRefs 和 toRef

toRef 的介绍与用法

1. 作用

toRef 用于从一个响应式对象中提取某个属性,并将其转换为一个独立ref 对象。这个 ref 对象与原始属性保持响应式连接,即修改 ref 的值会同步更新原始属性,反之亦然。

2. 使用场景

  • 当需要将响应式对象的某个属性单独提取出来时。
  • 当需要将某个属性传递给组合式函数或子组件时。

3. 示例代码

import { reactive, toRef } from 'vue';

const state = reactive({
  name: 'Alice',
  age: 25
});

const nameRef = toRef(state, 'name'); // 提取 name 属性为 ref
console.log(nameRef.value); // 输出 Alice

nameRef.value = 'Bob'; // 修改 ref 的值
console.log(state.name); // 输出 Bob,原始属性也被更新

state.age = 30; // 修改原始属性
const ageRef = toRef(state, 'age');
console.log(ageRef.value); // 输出 30,ref 与原始属性同步[^36^]
toRefs的介绍与用法

1. 作用

toRefs 用于将一个响应式对象的所有属性转换为一个普通对象,其中每个属性都是一个 ref 对象。这些 ref 对象与原始属性保持响应式连接。

在这里插入图片描述

2. 使用场景

  • 当需要解构响应式对象并在模板中使用其属性时,toRefs 可以确保解构后的属性仍然保持响应式。
  • 当需要将响应式对象的属性传递给子组件时,toRefs 可以确保子组件接收到的属性是响应式的。

3. 示例代码

import { reactive, toRefs } from 'vue';

const state = reactive({
  name: 'Alice',
  age: 25
});

const stateRefs = toRefs(state); // 将所有属性转换为 ref
console.log(stateRefs.name.value); // 输出 Alice
console.log(stateRefs.age.value); // 输出 25

stateRefs.name.value = 'Bob'; // 修改 ref 的值
console.log(state.name); // 输出 Bob,原始属性也被更新

state.age = 30; // 修改原始属性
console.log(stateRefs.age.value); // 输出 30,ref 与原始属性同步[^37^]

4. 原理解释

toRefs 遍历响应式对象的所有属性,并为每个属性调用 toRef,从而创建一个包含所有属性的 ref 对象的普通对象。


toRef 与toRefs 的区别

特性toReftoRefs
作用对象单个属性整个对象的所有属性
返回值单个 ref 对象包含所有属性的 ref 对象的普通对象
使用场景提取单个属性并保持响应式连接解构整个对象并保持响应式连接
灵活性更灵活,适用于特定属性适用于需要批量处理所有属性的场景

computed

在 Vue 3 中,computed 是一个非常重要的响应式特性,用于声明式地计算派生值。它基于依赖的响应式数据自动缓存计算结果,并且只有当依赖项发生变化时才会重新计算。

1. computed 的基本用法

computed 可以在 Vue 组件的 setup() 函数中通过 computed() 方法使用,也可以在选项式 API 中直接定义。

//CompositionAPI中的写法

import { ref, computed } from 'vue';

export default {
    setup(){
        const fiestName = ref('John');
        const lastName = ref('Doa');
        
        //定义一个 computed 属性
        const fullName = computed(()=>{
            return `${firstName.value} ${lastName.value}`
        });
		
        return {
            firstName,
            lastName,
            fullName
        };
    }
};

在模板中可以直接使用fullName

<template>
  <div>
    <p>Full Name: {{ fullName }}</p>
    <input v-model="firstName" placeholder="First Name">
    <input v-model="lastName" placeholder="Last Name">
  </div>
</template>
2. computed 的两种模式

computed 支持两种模式:getter-only (只读)和 writable(可读可写)。

这是最常见的模式,只提供一个 getter 函数,用于计算派生值。

const fullName = computed(() => {
  return `${firstName.value} ${lastName.value}`;
});

如果需要让 computed 属性可写,可以传入一个对象,包含 getset 方法。

const fullName = computed({
  get() {
    return `${firstName.value} ${lastName.value}`;
  },
  set(newValue) {
    const names = newValue.split(' ');
    firstName.value = names[0];
    lastName.value = names[1];
  }
});

在模板中,fullName 现在可以被赋值:

<input v-model="fullName" placeholder="Full Name">

完整示例:

<template>
  <div class="person">
    姓: <input type="text" v-model="firstName"><br><br>
    名: <input type="text" v-model="lastName"><br><br>
  全名:<span>{{ fullName }}</span>
  <button @click="changFN">改全名为li-si</button> 
  </div>
 
</template>
<script setup lang="ts" name = "Person">

  import {ref,computed} from 'vue';

  let firstName = ref('zhang');
  let lastName = ref('san');

  // //这么定义的fullName是一个计算属性,且是只读的
  // let fullName = computed(()=>{
  //   return firstName.value.slice(0,1).toUpperCase() +firstName.value.slice(1)+ '-' + lastName.value;
  // })
  //这么定义的fullName是一个计算属性,是可读可写的
    let fullName = computed({
      get(){
        return firstName.value.slice(0,1).toUpperCase() +firstName.value.slice(1)+ '-' + lastName.value;
      },
      set(val){
        const [str1,str2] = val.split('-');
        firstName.value = str1;
        lastName.value = str2;
        console.log('set');
      }
    })

  function changFN(){
    fullName.value = 'li-si';
  }

</script>
<style scoped>
  .person{
    background-color: rgb(5, 141, 141);
    border-radius: 10px;
    color: rgb(195, 202, 202);
    box-shadow: 0 0 10px;
    padding: 20px;
  }
  button{
    margin: 10px;
  }
</style>
3. 注意点

(1) 缓存机制

computed 是基于依赖的缓存。只有当依赖项发生变化时,才会重新计算。如果依赖项没有变化,即使手动调用 computed,也不会重新计算,而是直接返回缓存值。

(2) 避免将 computed 用于副作用操作

computed 应该是纯函数,仅用于计算派生值。不要在 computed 中执行副作用操作(如 API 请求、修改数据等)。如果需要执行副作用操作,应该使用 watchwatchEffect

(3) 依赖响应式数据

computed 的依赖必须是响应式数据(如 refreactive 或其他 computed)。如果依赖非响应式数据,computed 将不会自动更新。

(4) 在 computed 中访问 this

在 Options API 中,可以直接通过 this 访问组件的上下文。但在 Composition API 中,computed 是一个独立的函数,不能直接访问 this,需要通过 setup() 中的变量来访问。

(5) computed 的返回值

computed 的返回值必须是一个值(如字符串、数字、对象等),不能返回函数或其他复杂结构。

(6) 避免过度使用 computed

虽然 computed 很强大,但过度使用可能会导致组件逻辑复杂化。对于简单的逻辑,直接在模板中使用表达式可能更清晰。

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

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

相关文章

解决redis lettuce连接池经常出现连接拒绝(Connection refused)问题

一.软件环境 windows10、11系统、springboot2.x、redis 6 7 linux&#xff08;centos&#xff09;系统没有出现这问题&#xff0c;如果你是linux系统碰到的&#xff0c;本文也有一定大参考价值。 根本思路就是&#xff1a;tcp/ip连接的保活(keepalive)。 二.问题描述 在spr…

从DNS到TCP:DNS解析流程和浏览器输入域名访问流程

1 DNS 解析流程 1.1 什么是DNS域名解析 在生活中我们会经常遇到域名&#xff0c;比如说CSDN的域名www.csdn.net&#xff0c;百度的域名www.baidu.com,我们也会碰到IP&#xff0c;现在目前有的是IPV4&#xff0c;IPV6。那这两个有什么区别呢&#xff1f;IP地址是互联网上计算机…

解锁Egg.js:从Node.js小白到Web开发高手的进阶之路

一、Egg.js 是什么 在当今的 Web 开发领域&#xff0c;Node.js 凭借其事件驱动、非阻塞 I/O 的模型&#xff0c;在构建高性能、可扩展的网络应用方面展现出独特的优势 &#xff0c;受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端&#xff0c;还能在服务器端大展身手&…

JavaWeb后端基础(4)

这一篇就开始是做一个项目了&#xff0c;在项目里学习&#xff0c;我主要记录在学习过程中遇到的问题&#xff0c;以及一些知识点 Restful风格 一种软件架构风格 在REST风格的URL中&#xff0c;通过四种请求方式&#xff0c;来操作数据的增删改查。 GET &#xff1a; 查询 …

【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey

这篇文章发表于2024年4月 摘要 大语言模型&#xff08;LLMs&#xff09;的快速发展推动了多个领域的变革&#xff0c;重塑了通用人工智能的格局。然而&#xff0c;这些模型不断增长的计算和内存需求带来了巨大挑战&#xff0c;阻碍了学术研究和实际应用。为解决这些问题&…

OpenGL ES -> GLSurfaceView纹理贴图

贴图 XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height…

DE2115实现4位全加器和3-8译码器(FPGA)

一、配置环境 1、Quartus 18.1安装教程 软件&#xff1a;Quartus版本&#xff1a;Quartus 18.1语言&#xff1a;英文大小&#xff1a;5.78G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09; 下载通道①百度网盘丨64位下载…

【AI大模型】DeepSeek + Kimi 高效制作PPT实战详解

目录 一、前言 二、传统 PPT 制作问题 2.1 传统方式制作 PPT 2.2 AI 大模型辅助制作 PPT 2.3 适用场景对比分析 2.4 最佳实践与推荐 三、DeepSeek Kimi 高效制作PPT操作实践 3.1 Kimi 简介 3.2 DeepSeek Kimi 制作PPT优势 3.2.1 DeepSeek 优势 3.2.2 Kimi 制作PPT优…

run方法执行过程分析

文章目录 run方法核心流程SpringApplicationRunListener监听器监听器的配置与加载SpringApplicationRunListener源码解析实现类EventPublishingRunListener 初始化ApplicationArguments初始化ConfigurableEnvironment获取或创建环境配置环境 打印BannerSpring应用上下文的创建S…

面试-----每日一题

一、字节一面&#xff08;操作系统&#xff09; 什么是死锁&#xff1f;如何处理死锁问题&#xff1f; 死锁是指两个或两个以上的进程在执行过程中&#xff0c;由于竞争资源或者由于彼此通讯而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。…

CentOS 7中安装Dify

Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等&#xff0c;让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时&#xff0c;会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…

qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系

qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系 code review! 文章目录 qt-C++笔记之Linux下Qt环境变量设置及与QtCreator的关系一.Qt关键的环境变量1.1.PATH1.2.LD_LIBRARY_PATH1.3.QML2_IMPORT_PATH二.若不手动设置这三个环境变量2.1.PATH 的默认路径2.2.LD_LIBRARY_…

Flutter 学习之旅 之 flutter 使用 carousel_slider 简单实现轮播图效果

Flutter 学习之旅 之 flutter 使用 carousel_slider 简单实现轮播图效果 目录 Flutter 学习之旅 之 flutter 使用 carousel_slider 简单实现轮播图效果 一、简单介绍 二、简单介绍 carousel_slider 三、安装 carousel_slider 四、简单案例实现 五、关键代码 一、简单介…

【JavaScript—前端快速入门】JavaScript 对象与函数

JavaScript 对象 1. JavaScripe 数组 创建数组的方式 使用 new 关键字创建 使用字面量方式创建 [常用] 注意&#xff0c;JavaScipt 不要求数组元素类型都相同&#xff1b; 数组操作 读&#xff1a;使用下标的方式访问数组元素&#xff08;从0开始) 保存代码&#xff0c;打开…

java中的局部变量

文章目录 一、定义二、作用域和作用位置三、声明周期和初始化四、内存管理五、Java内存区域划分六、例子 一、定义 在java中&#xff0c;局部变量指在方法、构造方法、代码块&#xff08;如{}包裹的语句块&#xff09;内部声明的变量 class work {{int a 10;}public work() {i…

(IDE接入DeepSeek)简单了解DeepSeek接入辅助开发与本地部署建议

重点&#xff1a;IDE接入DeepSeek是否收费 收费&#xff01; 本文章主要是为了给小白避雷&#xff0c;目前很多文章告诉大家怎么接入DeepSeek&#xff0c;但是并未告知大家是否收费。如果是想白嫖的&#xff0c;就可以不用去接入了。 一、引言 最近爆火的AI人工智能工具DeepSe…

【算法学习之路】5.贪心算法

贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳&#xff01;3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也写了几篇&#xff0c;题单正在更新&#xf…

0x03 http协议和分层架构

HTTP协议 简介 Hyper Text Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则 http协议基于TCP协议&#xff1a;面向连接&#xff0c;安全基于请求-响应模型&#xff1a;一次请求对应一次响应HTTP协议是无状态的协议&#xff…

智能合约安全指南 [特殊字符]️

智能合约安全指南 &#x1f6e1;️ 1. 安全基础 1.1 常见漏洞类型 重入攻击整数溢出权限控制缺陷随机数漏洞前后运行攻击签名重放 1.2 安全开发原则 最小权限原则检查-生效-交互模式状态机安全失败保护机制 2. 重入攻击防护 2.1 基本防护模式 contract ReentrancyGuarde…

【Python项目】基于Python的书籍售卖系统

【Python项目】基于Python的书籍售卖系统 技术简介&#xff1a;采用Python技术、MYSQL数据库等实现。 系统简介&#xff1a;书籍售卖系统是一个基于B/S结构的在线图书销售平台&#xff0c;主要分为前台和后台两部分。前台系统功能模块分为&#xff08;1&#xff09;用户中心模…