Vue3的核心语法【未完】

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 很强大,但过度使用可能会导致组件逻辑复杂化。对于简单的逻辑,直接在模板中使用表达式可能更清晰。

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

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

相关文章

计算机视觉|ViT详解:打破视觉与语言界限

一、ViT 的诞生背景 在计算机视觉领域的发展中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直占据重要地位。自 2012 年 AlexNet 在 ImageNet 大赛中取得优异成绩后&#xff0c;CNN 在图像分类任务中显示出强大能力。随后&#xff0c;VGG、ResNet 等深度网络架构不…

BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]

题目&#xff1a; 我仿佛见到了一位故人。。。也难怪&#xff0c;题目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后&#xff1a; ......不太行&#xff0c;好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶&#xff1f;那 f…

区块链-未来世界的网络形态?

前言 各位读者们&#xff0c;时隔半年作者终于想起了自己的账号密码&#xff0c;今天终于又双叒叕更新啦。今天带给大家的内容仍旧是区块链相关&#xff0c;主要谈谈作者对区块链行业的看法&#xff0c;废话不多说让我们开始发车(扶稳坐好)。 引言 过去的几个月中&#xff0c;比…

Linux总结

1 用户与用户组管理 1.1 用户与用户组 //linux用户和用户组 Linux系统是一个多用户多任务的分时操作系统 使用系统资源的用户需要账号进入系统 账号是用户在系统上的标识&#xff0c;系统根据该标识分配不同的权限和资源 一个账号包含用户和用户组 //用户分类 超级管理员 UID…

掌握 findIndex、push 和 splice:打造微信小程序的灵活图片上传功能✨

文章目录 ✨ 掌握 findIndex、push 和 splice&#xff1a;打造微信小程序的灵活图片上传功能 &#x1f31f;示例场景&#xff1a;小程序图片上传&#x1f33c; 认识 findIndex定义语法在代码中的应用示例当前行为 &#x1f680; 认识 push定义语法在代码中的应用示例特点 ✂️ …

【Java】—— 堆

一、堆的定义 在计算机科学中&#xff0c;堆&#xff08;heap&#xff09;是一种特殊的树状数据结构。用于存储和管理数据。堆通常用于实现优先队列。其中具有最高&#xff08;或最低&#xff09;优先级的元素始终位于堆的根部。 堆分为最小堆和最大堆两种类型&#xff1a; …

Windows 使用 Docker + WSL2 部署 Ollama(AMD 显卡推理)搭建手册‌

Windows 使用 Docker WSL2 部署 Ollama&#xff08;AMD 显卡推理&#xff09;搭建手册‌ ‌手册目标‌ 在 Windows 11 上通过 ‌Docker WSL2‌ 调用 AMD 显卡运行 Ollama 推理服务。 实现 ‌低延迟、高性能的本地模型推理‌&#xff0c;同时不影响 Windows 正常使用。 标记…

【每天认识一个漏洞】shiro反序列化漏洞

&#x1f31d;博客主页&#xff1a;菜鸟小羊 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 以下是在实际业务中遇到的一个漏洞&#xff0c;仅用来学习&#xff0c;通过暴露的 /actuator/heapdump 端点获取 Shiro key…

【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优…

音频3A测试--AGC(自动增益)和NS(降噪)测试

一、测试前期准备 一台电脑&#xff1a;用于作为控制播放和录制数据&#xff1b; 一台音频处理器(调音台)&#xff1a;控制每个通道播放的数据&#xff0c;如噪声、人工头、模拟设备B输入的数据、收集标准麦克风&#xff0c;设备A处理完成的数据&#xff1b; 四个高保真音响&…

zabbix配置邮件告警

目录 实现步骤&#xff1a; 实现目的&#xff1a; 1.在监控端操作&#xff1a; 2.web界面部署 ​​​​​​​实现步骤&#xff1a; 1、在 zabbix服务端配置邮件发送脚本和修改 zabbix服务端配置文件; 2、在 zabbix前端控制台进行相关设置。 实现目的&#xff1a; Zab…

PHP fastadmin 学习

安装php环境安装mysql插件 修改 php.ini下载 phpstudy、fastadmin 错误 安装FastAdmin could not find driver 参考链接 安装插件 创建1.php <? phpinfo(); ?>运行 http://127.0.0.1/1.php 查看 POD 页面访问404 伪静态 Apache <IfModule mod_rewrite.c> O…

PARETO PROMPT OPTIMIZATION

题目 帕累托提示优化 论文地址&#xff1a;https://openreview.net/forum?idHGCk5aaSvE 摘要 自然语言迅速优化或及时工程已成为一种强大的技术&#xff0c;可以解锁大型语言模型&#xff08;LLMS&#xff09;的各种任务的潜力。尽管现有方法主要集中于最大化LLM输出的单一特…

Agent智能体是什么?

文章目录 一、Agent的起源与发展1.1时间线1.2核心驱动力 二、Agent的定义与架构2.1基本定义2.2典型结构&#xff08;以GPTs为例&#xff09; 三、OpenAI的Agent演进路径3.1关键阶段3.2技术支撑3.3 GPTs生态经济模型 四、其他Agent平台对比五、Agent实践案例5.1文本处理自动化5.…

【Linux第三弹】Linux基础指令 (下)

目录 &#x1f31f;1.find指令 1.1find使用实例 ​编辑 &#x1f31f;2.which指令 &#x1f31f;3.grep指令 3.1grep使用实例 &#x1f31f; 4.zip/unzip指令 4.1 zip/unzip使用实例 &#x1f31f;5.tar指令 5.1 tar使用实例 &#x1f31f;6.完结 很庆幸走在自己…

【Laplacian边缘检测详解】

Laplacian边缘检测详解 目录 Laplacian边缘检测详解一. 定义二. 原理三. 特点四. 使用技巧五. MATLAB示例代码示例1&#xff1a;基本Laplacian边缘检测示例2&#xff1a;扩展Laplacian核的使用示例3&#xff1a;与Sobel边缘检测的比较示例4&#xff1a;检测图像中的文字边缘示例…

为什么要学习数据结构与算法

今天&#xff0c;我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心&#xff0c;更是每一位开发者从“小白”迈向“高手”的必经之路。 1、为什么要学习数据结构与算法 总的来说&#xff0c;数据结构与算法是&#xff1a; 求职的“敲门砖”…

【第13节】C++设计模式(行为模式)-Template(模板)模式

一、问题的提出 Template 模式&#xff1a;算法步骤框架与细节实现的分离 假设我们正在开发一个文档处理系统&#xff0c;需要支持多种文档格式的导出&#xff08;如 PDF、Word、HTML 等&#xff09;。每种文档格式的导出过程大致相同&#xff0c;都包含以下步骤&#xff1a; …

安卓binder驱动内核日志调试打印开放及原理(第一节)

背景&#xff1a; 经常有学员朋友在做系统开发时候&#xff0c;有时候遇到binder相关的一些问题&#xff0c;这个时候可能就需要比较多的binder相关日志&#xff0c;但是正常情况下这些binder通讯的的内核日志都是没有的打印的&#xff0c;因为经常binder通讯太过于频繁&#…

uniapp 常用 UI 组件库

1. uView UI 特点&#xff1a; 组件丰富&#xff1a;提供覆盖按钮、表单、图标、表格、导航、图表等场景的内置组件。跨平台支持&#xff1a;兼容 App、H5、小程序等多端。高度可定制&#xff1a;支持主题定制&#xff0c;组件样式灵活。实用工具类&#xff1a;提供时间、数组操…