vue3 中那些常用 靠copy 的内置函数

文章目录

    • vue3 常用函数罗列总结
    • vue3 中批量注册组件
    • vue3 自定义指令应用
    • define 应用补充
    • defineComponent 不同场景应用实例

vue3 常用函数罗列总结

  1. toRefs

    • 用途
      • 用于将一个响应式对象(例如reactive创建的对象)转换为普通对象,其中每个属性都被转换为ref。这样做的好处是在解构响应式对象时不会丢失响应性。
    • 示例
      • 假设我们有一个reactive对象state,如下:
        import { reactive, toRefs } from 'vue';
        const state = reactive({count: 0,message: 'Hello'
        });
        // 如果直接解构,会丢失响应性
        // const { count, message } = state;
        const { count, message } = toRefs(state);
        // 现在count和message是ref,可以保持响应性
        console.log(count.value); 
        count.value++;
        
    • 注意点
      • 主要用于在需要解构响应式对象的场景下,确保属性仍然能够触发响应式更新。
  2. toRaw

    • 用途
      • 可以获取一个由reactive或者readonly创建的代理对象的原始对象。在某些情况下,当你不想通过代理访问对象,而是直接操作原始对象时很有用。
    • 示例
      • 例如,有一个reactive对象obj
        import { reactive, toRaw } from 'vue';
        const obj = reactive({name: 'John'
        });
        const rawObj = toRaw(obj);
        // 直接操作原始对象,不会触发代理相关的响应式更新
        rawObj.name = 'Jane';
        
    • 注意点
      • 直接操作原始对象可能会导致响应式系统无法正确追踪变化,所以要谨慎使用。一般用于需要将对象传递给外部非响应式的库或者函数的场景。
  3. defineProps

    • 用途
      • 用于在setup函数中定义组件的props。它是一个编译时宏,提供了基于类型的props声明方式,使得组件的props定义更加清晰和类型安全。
    • 示例
      • 在一个Vue组件中:
        <template><div>{{ props.message }}</div>
        </template>
        <script setup>
        const props = defineProps({message: String
        });
        </script>
        
    • 注意点
      • 它只能在<script setup>中使用。并且defineProps返回的对象是只读的,不能直接修改props的值。如果需要修改,应该通过向父组件发射事件来请求修改。
  4. defineExpose

    • 用途
      • 用于在<script setup>组件中明确地指定组件向外暴露的属性和方法。默认情况下,在<script setup>中的变量和函数不会自动暴露给父组件,defineExpose可以控制暴露的内容。
    • 示例
      • 假设我们有一个子组件ChildComponent
        <template><button @click="handleClick">Click me</button>
        </template>
        <script setup>
        const a = 1;
        const handleClick = () => {console.log('Clicked');
        };
        defineExpose({a,handleClick
        });
        </script>
        
      • 父组件可以通过模板引用访问这些暴露的属性和方法:
        <template><ChildComponent ref="childRef"></ChildComponent><button @click="accessChildProperties">Access Child</button>
        </template>
        <script setup>
        import { ref } from 'vue';
        const childRef = ref(null);
        const accessChildProperties = () => {console.log(childRef.value.a);childRef.value.handleClick();
        };
        </script>
        
    • 注意点
      • 合理使用defineExpose可以更好地控制组件的接口,避免不必要的属性和方法暴露给父组件。
  5. watch

    • 用途
      • 用于监听一个或多个响应式数据的变化,并在数据变化时执行一个副作用函数。它可以用于响应式数据的深度监听、异步操作等场景。
    • 示例
      • 监听一个ref
        import { ref, watch } from 'vue';
        const count = ref(0);
        watch(count, (newValue, oldValue) => {console.log(`Count changed from ${oldValue} to ${newValue}`);
        });
        count.value++;
        
      • 监听一个reactive对象的属性:
        import { reactive, watch } from 'vue';
        const state = reactive({name: 'John'
        });
        watch(() => state.name, (newValue, oldValue) => {console.log(`Name changed from ${oldValue} to ${newValue}`);
        });
        state.name = 'Jane';
        
    • 注意点
      • watch可以设置深度监听(deep选项)、立即执行(immediate选项)等配置。同时,当监听多个数据源时,要注意合理处理每个数据源变化时的逻辑。

6.watchEffect用途
- 它会立即执行一个函数,并且会自动追踪这个函数内部使用的响应式数据。当这些响应式数据发生变化时,函数会重新执行。

  • 示例
    • 例如:
      import { ref, watchEffect } from 'vue';
      const count = ref(0);
      watchEffect(() => {console.log(`Count is now ${count.value}`);
      });
      count.value++;
      
  • 注意点
    • watch不同,watchEffect不需要手动指定要监听的数据,它会自动根据函数内部使用的响应式数据进行追踪。但是这也可能导致一些意外的重新执行情况,所以要注意函数内部的逻辑和副作用。
  1. computed
    • 定义和用途
      • computed用于创建计算属性。它接受一个函数作为参数,这个函数会根据它所依赖的响应式数据自动重新计算结果。计算属性具有缓存机制,只有当它所依赖的响应式数据发生变化时,才会重新计算。
    • 示例
      • 假设有一个ref代表数量和一个ref代表单价,计算总价:
        import { ref, computed } from 'vue';
        const quantity = ref(2);
        const price = ref(5);
        const total = computed(() => quantity.value * price.value);
        console.log(total.value); // 10
        quantity.value++;
        console.log(total.value); // 15
        
    • 注意点
      • 计算属性默认是只读的。如果要创建可写的计算属性,可以传递一个包含getset函数的对象给computed。例如:
        const fullName = computed({get: () => firstName.value + ' ' + lastName.value,set: (newValue) => {const names = newValue.split(' ');firstName.value = names[0];lastName.value = names[1];}
        });
        
  2. injectprovide
    • 定义和用途(provide
      • provide用于在祖先组件中提供一个值,使得后代组件可以访问这个值。它接受两个参数,第一个参数是注入的键(可以是Symbol或者String),第二个参数是要提供的值。
    • 示例(provide
      • 在祖先组件中:
        import { provide } from 'vue';
        const theme = { color: 'blue' };
        provide('theme', theme);
        
    • 定义和用途(inject
      • inject用于在后代组件中注入由祖先组件提供的值。它接受一个参数,即注入的键,返回注入的值。如果没有找到对应的提供值,它可以返回一个默认值。
    • 示例(inject
      • 在后代组件中:
        import { inject } from 'vue';
        const theme = inject('theme', { color: 'black' });
        console.log(theme.color);
        
    • 注意点
      • provideinject主要用于跨组件层级的数据传递。但要注意过度使用可能会导致数据来源不清晰,所以要谨慎使用,并且最好在文档中明确组件之间的这种依赖关系。

vue3 中批量注册组件

  1. Vue 3全局组件批量注册(根据目录文件夹读取注册,Webpack环境)

    • 目录结构准备
      • 假设我们有一个components文件夹,里面存放着多个Vue组件,组件文件以.vue为后缀。例如,components文件夹下有Button.vueInput.vueCard.vue等组件。
    • 批量注册函数实现
      • 创建一个函数来读取指定目录下的组件并进行批量注册。可以使用require.context(在基于Webpack等构建工具的环境下)来实现。
        • main.js或者一个专门的工具文件(如registerComponents.js)中编写以下代码:
          import { createApp } from 'vue';
          const app = createApp(App);
          // 创建一个函数用于批量注册组件
          const registerGlobalComponents = () => {// 使用require.context读取组件目录const requireComponent = require.context('./components', true, /\.vue$/);requireComponent.keys().forEach((fileName) => {// 获取组件配置const componentConfig = requireComponent(fileName);// 提取组件名,将文件名转换为组件名(首字母大写)const componentName = fileName.split('/').pop().replace(/\.\w+$/, '').replace(/^\w/, (c) => c.toUpperCase());// 注册组件app.component(componentName, componentConfig.default || componentConfig);});
          };
          registerGlobalComponents();
          app.mount('#app');
          
      • 解释:
        • require.context函数用于创建一个上下文,它接受三个参数。第一个参数是要搜索的目录('./components'),第二个参数true表示是否搜索子目录,第三个参数/\.vue$/是一个正则表达式,用于匹配文件名(只匹配.vue文件)。
        • requireComponent.keys()返回所有匹配的文件路径数组。对于每个文件路径fileName,通过requireComponent(fileName)获取组件的配置。
        • 提取组件名时,首先使用split('/')分割文件路径,获取文件名,然后使用replace方法去掉文件后缀.vue,最后将文件名的首字母转换为大写,作为组件名。
        • 使用app.component方法将组件注册到应用中,其中componentName是组件名,componentConfig.default || componentConfig是组件配置(在ES模块中,组件通常是通过export default导出的,所以先尝试获取default属性)。
    • 注意事项
      • 这种方式依赖于构建工具对require.context的支持。如果不使用Webpack等支持这种语法的构建工具,可能需要使用其他方式来读取文件目录和组件。
      • 组件名的提取方式是基于文件名的简单转换。如果组件文件名不符合常规命名规范或者有特殊要求,可能需要调整组件名提取的逻辑。
  2. Vue 3 全局组件批量注册 vite 环境

    • 目录结构设置
      • 假设在src目录下有一个components文件夹,该文件夹下包含了所有需要全局注册的组件,组件文件以.vue为后缀。例如有Button.vueInput.vue等组件。
    • 创建批量注册函数
      • src目录下创建一个registerGlobalComponents.js文件(文件名可以自定义)。
      • 代码如下:
        import { App } from 'vue';
        // 自动导入组件目录下的所有.vue组件
        const requireComponent = import.meta.globEager('./components/*.vue');
        export default function registerGlobalComponents(app: App) {for (const path in requireComponent) {const componentConfig = requireComponent[path];// 获取组件名,将文件名转换为组件名(首字母大写)const componentName = path.split('/').pop().replace(/\.\w+$/, '').replace(/^\w/, (c) => c.toUpperCase());app.component(componentName, componentConfig.default);}
        }
        
      • 解释:
        • 在Vite环境中,import.meta.globEager用于同步地导入指定目录下的模块。这里它会导入./components/*.vue目录下的所有.vue组件,返回一个对象,键是文件路径,值是组件模块。
        • 然后通过遍历这个对象,对于每个组件模块,提取组件名(将文件名转换为组件名,首字母大写)。
        • 最后使用app.component方法将组件注册到App应用中,其中componentName是组件名,componentConfig.default是组件模块的默认导出(通常是组件本身)。
    • 在主文件中应用注册函数
      • main.js文件中,代码如下:
        import { createApp } from 'vue';
        import App from './App.vue';
        import registerGlobalComponents from './registerGlobalComponents';
        const app = createApp(App);
        registerGlobalComponents(app);
        app.mount('#app');
        
      • 解释:
        • 首先导入createApp函数用于创建应用,App组件作为根组件,以及刚刚创建的registerGlobalComponents函数。
        • 创建app应用实例后,调用registerGlobalComponents函数并传入app实例,完成组件的批量注册。
        • 最后将应用挂载到DOM中的#app元素上。

vue3 自定义指令应用

  1. Vue 3自定义指令实例应用

    • 创建自定义指令
      • 自定义指令可以在main.js或者一个专门的指令文件(如directives.js)中创建。
      • 例如,创建一个v - autofocus自定义指令,用于在组件加载时自动聚焦到一个输入框元素。
        import { createApp } from 'vue';
        const app = createApp(App);
        app.directive('autofocus', {mounted(el) {el.focus();}
        });
        app.mount('#app');
        
      • 解释:
        • app.directive方法用于创建自定义指令。第一个参数'autofocus'是指令名称,第二个参数是一个包含指令钩子函数的对象。
        • mounted钩子函数中,el是指令所绑定的DOM元素,通过el.focus()方法使元素获得焦点。
    • 在模板中使用自定义指令
      • 假设我们有一个Input.vue组件,在其模板中使用v - autofocus自定义指令:
        <template><input type="text" v-autofocus>
        </template>
        
    • 其他指令钩子函数和应用场景
      • 除了mounted钩子函数,还有beforeMountupdatedbeforeUpdateunmounted等钩子函数。
      • 例如,创建一个v - tooltip自定义指令,用于在鼠标悬停时显示一个提示信息。
        app.directive('tooltip', {beforeMount(el, binding) {// 创建一个提示元素const tooltip = document.createElement('div');tooltip.textContent = binding.value;tooltip.style.position = 'absolute';tooltip.style.backgroundColor = 'gray';tooltip.style.color = 'white';tooltip.style.padding = '5px';tooltip.style.borderRadius = '3px';tooltip.style.zIndex = '10';// 将提示元素添加到文档中,但先隐藏document.body.appendChild(tooltip);el._tooltip = tooltip;},mounted(el, binding) {el.addEventListener('mouseenter', () => {const tooltip = el._tooltip;const rect = el.getBoundingClientRect();tooltip.style.display = 'block';tooltip.style.left = rect.left + 'px';tooltip.style.top = rect.bottom + 'px';});el.addEventListener('mouseleave', () => {const tooltip = el._tooltip;tooltip.style.display = 'none';});},unmounted(el) {const tooltip = el._tooltip;document.body.removeChild(tooltip);}
        });
        
      • 解释:
        • beforeMount钩子函数中,创建一个用于显示提示信息的div元素,设置其样式,并将其添加到文档中,但先隐藏起来。同时,将这个提示元素存储在el._tooltip中,方便后续使用。
        • mounted钩子函数中,为元素添加mouseentermouseleave事件监听器。当鼠标进入元素时,显示提示元素,并根据元素的位置设置提示元素的位置。当鼠标离开元素时,隐藏提示元素。
        • unmounted钩子函数中,当指令从元素上解绑时,将提示元素从文档中移除。
    • 注意事项
      • 在自定义指令中操作DOM元素时,要注意浏览器的兼容性和性能。例如,频繁地创建和销毁DOM元素或者频繁地计算元素位置可能会导致性能问题。
      • 指令钩子函数中的参数(如elbinding)提供了有关指令绑定的重要信息,要正确理解和使用这些参数来实现所需的功能。binding参数包含指令的值、表达式、参数等信息。

define 应用补充

  1. defineEmits

    • 用途
      • <script setup>语法糖中,用于定义组件向外发射(emit)的事件。这使得组件可以和父组件进行通信,当子组件内部发生某些操作时,可以通过发射事件的方式通知父组件。
    • 示例
      • 假设有一个子组件ChildComponent.vue,里面有一个按钮,点击按钮时需要通知父组件:
        <template><button @click="handleClick">Click me</button>
        </template>
        <script setup>
        const emit = defineEmits(['customClick']);
        const handleClick = () => {emit('customClick');
        };
        </script>
        
      • 父组件ParentComponent.vue可以监听这个事件:
        <template><ChildComponent @customClick="onChildClick"></ChildComponent>
        </template>
        <script setup>
        const onChildClick = () => {console.log('Child component was clicked');
        };
        </script>
        
    • 注意点
      • defineEmits返回的emit函数只能用于发射在参数中定义的事件。它提供了一种类型安全的方式来处理事件发射,有助于避免拼写错误等问题。
  2. defineAsyncComponent

    • 用途
      • 用于定义一个异步组件。在大型应用中,有些组件可能体积较大或者需要异步加载(例如从服务器获取组件代码),defineAsyncComponent可以实现组件的懒加载,从而提高应用的初始加载性能。
    • 示例
      • 假设我们有一个较大的组件LargeComponent.vue,希望异步加载它:
        import { defineAsyncComponent } from 'vue';
        const AsyncLargeComponent = defineAsyncComponent(() =>import('./LargeComponent.vue')
        );
        
      • 然后在其他组件中可以像使用普通组件一样使用这个异步组件:
        <template><div><AsyncLargeComponent></AsyncLargeComponent></div>
        </template>
        <script setup>
        // 确保已经正确导入AsyncLargeComponent
        </script>
        
    • 注意点
      • 异步组件在加载过程中可以提供加载状态的反馈,例如显示一个加载动画。可以通过defineAsyncComponent的选项来配置加载状态、加载失败等情况的处理。例如:
        const AsyncLargeComponent = defineAsyncComponent({loader: () => import('./LargeComponent.vue'),loadingComponent: LoadingComponent,errorComponent: ErrorComponent
        });
        
      • 其中LoadingComponent会在异步组件加载过程中显示,ErrorComponent会在异步组件加载失败时显示。
  3. defineComponent

    • 用途
      • 用于定义一个Vue组件,它是一个返回组件选项对象的函数。在使用JavaScript编写组件选项(非<script setup>语法糖)时经常会用到。它可以接收一个对象(组件选项)或者一个返回组件选项对象的函数作为参数。
    • 示例
      • 以下是使用defineComponent定义一个简单组件的示例:
        import { defineComponent, ref } from 'vue';
        const MyComponent = defineComponent({setup() {const count = ref(0);const increment = () => {count.value++;};return {count,increment};},template: `<div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>`
        });
        
    • 注意点
      • 当使用组合式API(setup函数)和选项式API混合编写组件时,defineComponent可以很好地处理组件选项的合并和类型推导。它也有助于代码的组织结构清晰,特别是在处理复杂组件选项时。

defineComponent 不同场景应用实例

  1. 简单的计数器组件
  • 功能描述:创建一个具有一个按钮和一个显示计数数字的组件,每次点击按钮,计数数字加1。
  • 代码实现
    import { defineComponent, ref } from 'vue';
    export default defineComponent({setup() {// 创建一个响应式的ref,初始值为0const count = ref(0);const increment = () => {count.value++;};return {count,increment};},template: `<div><p>Count: {{ count }}</p><button @click="increment">Increment</button></div>`
    });
    
  • 解释
    • setup函数中,首先使用ref创建了一个响应式数据count,初始值为0。然后定义了一个函数increment,用于将count的值加1。最后将countincrement返回,这样它们就可以在模板中使用。
    • 模板部分使用了双大括号{{ count }}来显示count的值,并且将按钮的@click事件绑定到increment函数,当按钮被点击时,count的值就会增加。
  1. 带有父子组件通信的组件

    • 功能描述:创建一个父组件包含一个子组件,父组件向子组件传递一个初始计数,子组件有一个按钮用于增加计数,并且将更新后的计数发送回父组件。
    • 代码实现
      • 子组件ChildComponent.vue
        import { defineComponent, defineEmits, ref } from 'vue';
        export default defineComponent({setup(props) {const emit = defineEmits(['updateCount']);const increment = () => {emit('updateCount', props.count + 1);};return {increment};},props: {count: Number},template: `<div><button @click="increment">Increment in Child</button></div>`
        });
        
      • 父组件ParentComponent.vue
        import { defineComponent, ref } from 'vue';
        import ChildComponent from './ChildComponent.vue';
        export default defineComponent({setup() {const count = ref(0);const handleUpdateCount = (newCount) => {count.value = newCount;};return {count,handleUpdateCount};},template: `<div><p>Parent Count: {{ count }}</p><ChildComponent :count="count" @updateCount="handleUpdateCount"></ChildComponent></div>`
        });
        
    • 解释
      • 子组件:在setup函数中,通过defineEmits定义了一个名为updateCount的事件。increment函数用于发射这个事件,并将更新后的计数(props.count + 1)作为参数传递。props中定义了count属性,用于接收父组件传递过来的计数。
      • 父组件:在setup函数中,count是一个ref,用于存储计数。handleUpdateCount函数用于接收子组件发射的updateCount事件,并更新count的值。在模板中,将count传递给子组件的count属性,并且监听子组件的updateCount事件,当事件触发时,调用handleUpdateCount函数。
  2. 使用计算属性的组件

    • 功能描述:创建一个组件,有一个输入框用于输入商品价格,还有一个选择框用于选择税率,组件根据输入的价格和选择的税率计算含税价格并显示。
    • 代码实现
      import { defineComponent, ref, computed } from 'vue';
      export default defineComponent({setup() {const price = ref(0);const taxRateOptions = [{ label: '0%', value: 0 },{ label: '5%', value: 0.05 },{ label: '10%', value: 0.1 }];const selectedTaxRate = ref(taxRateOptions[0].value);const totalPrice = computed(() => {return price.value * (1 + selectedTaxRate.value);});return {price,taxRateOptions,selectedTaxRate,totalPrice};},template: `<div><input v - model="price" type="number" placeholder="Price"><select v - model="selectedTaxRate"><option v - for="option in taxRateOptions":value="option.value">{{ option.label }}</option></select><p>Total Price with Tax: {{ totalPrice }}</p></div>`
      });
      
    • 解释
      • setup函数中,price是一个ref,用于存储商品价格。taxRateOptions是一个包含税率选项的数组。selectedTaxRate是一个ref,用于存储用户选择的税率。
      • totalPrice是一个计算属性,通过computed函数创建。它根据priceselectedTaxRate的值计算含税价格。每当price或者selectedTaxRate的值发生变化时,totalPrice会自动重新计算。
      • 在模板中,使用v - model指令将输入框的值绑定到price,将选择框的值绑定到selectedTaxRate,并使用双大括号{{ totalPrice }}显示含税价格。

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

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

相关文章

数据结构-二叉树

一.二叉树的定义 二叉树有左右儿子之分 完美二叉树&#xff08;满二叉树&#xff09;除了最下面的没有儿子其他结点都有两个儿子&#xff0c;叶节点比较齐的&#xff0c;完全二叉树不是满二叉数允许缺失最后的结点 满二叉树可以达到2^k-1 边的总数节点数-1 二.二叉树的存储结构…

OKR制定指南

Goal Crafting 目标制定是最基本的领导活动之一。组织绩效和团队成长依赖于精心制定的目标。没有良好的目标制定练习&#xff0c;团队可能只关注眼前的事务&#xff0c;解决看似可以快速解决的问题。良好的目标制定迫使你不忽视或推迟那些需要新思维方式、合作或克服困难的问题…

详细分析Java中FilterChain过滤器的基本知识

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 从实战中学习&#xff1a; 常用在一些重复代…

TableGPT2-7B:用于表格数据分析的大规模解码器模型

TableGPT2-7B 是浙江大学开发的最先进的大规模解码器模型&#xff0c;专为涉及表格数据的数据密集型任务而设计。该模型以 Qwen2.5 架构为基础&#xff0c;包括针对表格数据的专用编码&#xff0c;其中独特的语义编码器可从行、列和整个表格中获取洞察力。 主要特点和功能 Ta…

SQL面试题——抖音SQL面试题 主播播出时长

主播播出时长 现有如下数据,主播id、房间号、播出的批次号,每个批次号进出房间的时间戳、分区时间: 每一次直播都有一个上播和下播,每个房间里,同一个批次号会有两条数据,分别记录了上播和下播时间,求每个主播的播出时长? 通过上面的数据,可以清晰的看出,同一个批次…

数字信号处理Python示例(14)生成锯齿波和三角波

文章目录 前言一、锯齿波和三角波二、生成锯齿波和三角波的Python代码三、仿真结果及分析写在后面的话 前言 因其独特的数学特性和物理表现&#xff0c;在工程和技术领域扮演着重要角色。这是生成非正弦信号的几个Python示例的其中一个&#xff0c;生成三角波与锯齿波&#xf…

HBase理论_HBase架构组件介绍

近来有些空闲时间&#xff0c;正好最近也在开发HBase相关内容&#xff0c;借此整理一下学习和对HBase组件的架构的记录和个人感受&#xff0c;付出了老夫不少心血啊&#xff0c;主要介绍的就是HBase的架构设计以及我的拓展内容。内容如有不当或有其他理解 matirx70163.com HB…

前端快速上手(一):HTML

目录 1. HTML 基础 1.1 HTML 标签 1.2 标签的结构关系 2. HTML 常见标签 2.1 标题标签: h1 - h6 2.2 段落标签: p 2.3 换行标签: br 2.4 图片标签: img 2.5 超链接: a 标签 2.5.1 外部链接 2.5.2 内部链接 2.5.3 文件资源链接 2.5.4 空链接 2.6 表格标签 2.7 表单…

QT<30> Qt中使鼠标变为转圈忙状态

前言&#xff1a;当我们在写软件时&#xff0c;在等待阻塞耗时操作时可以将鼠标变为忙状态&#xff0c;并在一段时间后恢复状态&#xff0c;可以用到GxtWaitCursor&#xff1a;Qt下基于RAII的鼠标等待光标类。 一、效果演示 二、详细代码 在项目中添加C文件&#xff0c;命名为…

Shell环境导致编译失败处理方法

在嵌入式Linux系统源码&#xff08;BSP包&#xff09;编译时&#xff0c;有可能会如现如下提示&#xff1a; [[: not found 这种提示&#xff0c;一般是Shell环境为dash而不是bash导致&#xff0c;可以通过如下命令来切换&#xff1a; sudo dpkg-reconfigure dash 执行后会…

nginx openresty lua-resty-http 使用的一些问题记录

需求背景 需求是使用 nginx 做一个 https 服务的代理 nginx 收到 http 请求后&#xff0c;需要修改 body 中的某些参数值&#xff0c;然后将修改后的数据发送到目标服务器&#xff08;https&#xff09; 本来以为很简单的需求&#xff0c;结果中间出现了不少岔子&#xff0c;这…

Redis的分布式锁分析

系列文章目录 Java项目对接redis&#xff0c;客户端是选Redisson、Lettuce还是Jedis&#xff1f; 由Redis引发的分布式锁探讨 系列文章目录一、什么是分布式锁&#xff1f;二、Redis分布式锁的几种实现1. 简单分布式锁2. Redlock 三、Redis 锁的问题1. 互斥失效2. 时钟偏移 四…

柯桥生活英语口语学习“面坨了”英语怎么表达?

“面坨了”英语怎么表达&#xff1f; 要想搞清楚这个表达&#xff0c;首先&#xff0c;我们要搞明白“坨”是啥意思&#xff1f; 所谓“坨”就是指&#xff0c;面条在汤里泡太久&#xff0c;从而变涨&#xff0c;黏糊凝固在一起的状态。 有一个词汇&#xff0c;很适合用来表达这…

鸿蒙NEXT应用示例:切换图片动画

【引言】 在鸿蒙NEXT应用开发中&#xff0c;实现图片切换动画是一项常见的需求。本文将介绍如何使用鸿蒙应用框架中的组件和动画功能&#xff0c;实现不同类型的图片切换动画效果。 【环境准备】 电脑系统&#xff1a;windows 10 开发工具&#xff1a;DevEco Studio NEXT B…

UAC2.0 speaker——speaker 数据传输

文章目录 麦克风数据传输准备音频数据抓包原始数据频谱分析(FFT)应用麦克风数据传输 上一节中实现了 USB 麦克风设备 本节主要介绍 MCU 麦克风的数据如何传输给上位机。 准备音频数据 MCU 端发送 48KHZ, 16bit 单声道的正弦波数据,正弦波数据的生成参考 音频——C语言生…

【多语言】每种语言打印helloworld,编译为exe会占多大空间

文章目录 背景c语言 53KBc 53KBgo 1.8Mdart 4.6Mpython未测试nodejs未测试rust未测试java未测试cmd || bash || powershell 未测试other 背景 各个版本的helloworld&#xff0c;纯属闲的, 环境如下: - win10 - mingw: gcc8.1.0 - go1.21 - dart3.5.4c语言 53KB gcc main.c -…

Android12的ANR解析

0. 参考&#xff1a; ANR分析 深入理解 Android ANR 触发原理以及信息收集过程 1.ANR的触发分类: ANR分为4类&#xff1a; InputDispatchTimeout&#xff1a;输入事件分发超时5s,包括按键和触摸事件。BroadcastTimeout&#xff1a;比如前台广播在10s内未执行完成&#xff0…

2022-2023全国高校计算机能力挑战赛区域赛python组编程题

mi目录 2022 1. 2. 1. 使用 format() 方法 2. 使用 f-string&#xff08;Python 3.6 及以上&#xff09; 2023 1. 2. 3. 4 闽农大宝玲楼 2022 1. 1.某动物研究员给动物园的动物们定了一个园区幸福值&#xff0c;其中园区幸福值的计算为一个园区内“所有动物的活动时…

函数的栈帧

前言&#xff1a; 1.请使用vs2013调试&#xff0c;我使用vs2019被恶心到了&#xff0c;封装严重&#xff0c;不利于观察。 2.函数栈帧&#xff1a;函数就是程序&#xff0c;程序就需要空间来运行&#xff0c;所以我们要为他分配空间&#xff0c;分配的空间用ebp esp维护&…

机器学习基础04

目录 1.朴素贝叶斯-分类 1.1贝叶斯分类理论 1.2条件概率 1.3全概率公式 1.4贝叶斯推断 1.5朴素贝叶斯推断 1.6拉普拉斯平滑系数 1.7API 2.决策树-分类 2.1决策树 2.2基于信息增益的决策树建立 2.2.1信息熵 2.2.2信息增益 2.2.3信息增益决策树建立步骤 2.3基于基…