vue3使用知识点总结

news2025/1/7 18:54:52

一、vue3 项目搭建

npm 6.x

npm init vite@latest myvue3 --template vue

vue 3.2.26

使用 element plus ui 框架

npm i -S element plus
//全部引入
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
const Vue = createApp(App);
Vue.use(ElementPlus);

使用 scss

npm install --save-dev sass-loader
npm install --save-dev node-sass
npm install --save-dev sass

vite.config

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

// https://vitejs.dev/config/
export default defineConfig({
    publicPath: './', //打包路径
    css: {
        //配置scss全局变量和方法
        preprocessorOptions: {
            scss: {
                additionalData: "@use './src/assets/scss/style.scss' as *;"
            }
        }
    },
    plugins: [vue()]
});

二、vu3 语法部分

生命周期

vue2vue3
beforeCreatesetup
createdsetup
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestoryonBeforeUnmount
destoryedonUnmounted

路由

import { useRoute,useRouter } from 'vue-router';

const router = useRouter();
const route = useRoute();

状态管理

import {useStore} from 'vuex';

const store = useStore();

reactive

返回对象的响应式副本

注意:
reactive 返回的对象,重新赋值丢失响应式
reactive 返回的对象不可以解构

const form = reactive({
    name: 'aa',
    age: 20
});

const { name, age } = form; //通过解构 此时name,age会丢失响应 要想让它具有响应式 需要通过toRefs处理
const { name, age } = toRefs(form); //此时name,age具有响应

ref

所有通过 ref 创建的数据 需要通过 xxx.value 取它的值, 在模板中无需通过.value。
可以简单地把 ref(obj) 理解为这个样子 reactive({value: obj})

import { ref } from "vue";
const count = ref(1);

console.log(cout.value);  //1
  • ref获取单个dom元素
<div ref="root"></div>
import { ref } from "vue";
const root = ref(null);
onMounted(() => {
    console.log(root.value)  //dom元素
}),
  • ref获取v-for中dom元素
<ul>
    <li :ref="setLiDom" v-for="(item, index) in state.list" :key="index">
        {{ item }}
    </li>
</ul>
import { ref, reactive } from "vue";
const state = reactive({
    list: [1, 2, 3, 4]
})

const refList = ref([]);

const setLiDom = (el) => {
    if(el){
        liItem.value.push(el);
    }
};

onMounted(() => {
    console.log(root.value)  //Proxy {0: li, 1: li, 2: li, 3: li}
}),

toRef 和 toRefs

  • toRef 用来为源响应式对象上的某个 property 新创建一个 ref。
const state = reactive({
    foo: 1,
    bar: 2
});

//目的使state对象中的foo属性保持响应式连接,修改其中一个都会同步修改那个属性
const fooRef = toRef(state, 'foo');
  • toRefs 将响应式对象转换为普通对象,其中结果对象的每个 property 都是指向原始对象相应 property 的 ref。
//toRefs常用于 es6 的解构赋值操作,保持每个属性的都为响应式
setup(){
    let data = reactive({
        name: '张三',
        age: 18
    });
    return {
        ...toRefs(data)
    }
}

toRaw 、markRaw

通过toRaw获取到原始对象,改变原始对象的值会同时改变响应式对象的值,但不会更新视图

const foo = {}
const reactiveFoo = reactive(foo)

//reactiveFoo 和 foo 是引用的同一个地址

console.log(toRaw(reactiveFoo) === foo) // true

通过markRaw包裹的原始对象,使其永远不会转换为响应式对象,也就是说转换之后修改值并不会更新视图

const foo = markRaw({})
console.log(isReactive(reactive(foo))) // false

unref

如果参数是一个 ref,则返回内部值,否则返回参数本身

let obj = ref({ a: 1, b: 2 });

let reult = isRef(obj) ? obj.value : obj;
//等价于
let reult = unref(obj);

shallowRef 和 triggerRef

setup() {
    //shallowRef创建一个比ref更浅的响应式对象,改变其属性值,不会触发监听
    const foo = shallowRef({
        a: 1111,
        b: 2222
    });

    setTimeout(() => {
        foo.value.a = 3333;
        triggerRef(foo); //需要手动触发才能改变a的值
    }, 2000);

    watchEffect(() => {
        console.log(foo.value.a); //1111  3333
    });

    return {
        foo
    };
}

defineProps 和 defineEmits

在 <script setup> 中必须使用 defineProps 和 defineEmits API 来声明 props 和 emits

<script setup>
const props = defineProps({
  foo: String
})

const emit = defineEmits(['change', 'delete'])
</script>立即触发回调函数

defineExpose

使用 <script setup> 的组件是默认关闭的,也就是说通过 ref 和$parent 是无法访问到的
解决办法:

import { ref } from 'vue';
const a = 1;
const b = ref(2);
defineExpose({ a, b });

computed

vue3中不再支持filter过滤器,vue2 中的filter 使用计算属性computed或者方法代替

import { computed, ref } from "vue";

const count = ref(1);
const total = computed(()=>{
    //需要根据传递的参数进行计算
    // return (val)=>{
    //     return val + count.value;
    // }
    return count.vallue;
})
setInterval(() => {
    count.value ++;
}, 1000);

watch、watchEffect

与选项式 API 中的 watch 完全等效

语法:watch(source, callback, [options])

options: deep(深度监听) 、immediate(立即触发回调函数)

// 侦听一个 getter
const state = reactive({ count: 0 });
watch(
    () => state.count,
    (count, prevCount) => {
        /* ... */
    }
);

// 直接侦听一个 ref
const count = ref(0);
watch(count, (count, prevCount) => {
    /* ... */
});

//侦听多个数据
//注意多个同步更改只会触发一次侦听器。
watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => {
    /* ... */
});

与watch的区别:
1、不需要指定监听的值,回调仅在侦听源发生变化时被调用
2、初始化会执行一次
3、watchEffect只能拿到变化后的值

    import { watchEffect } from 'vue';
    watchEffect(() => {
         /* ... */
    })

watchEffect 与 watch 的区别:

provide、inject

依赖注入,用来实现深层次组件之间的数据传递

//parent
import { reactive, readonly, provide } from 'vue';
const updateInfo = () => {
    baseInfo.name = '李四';
    baseInfo.age = 20;
};

const baseInfo = reactive({
    name: '张三',
    age: 12,
    updateInfo: updateInfo
});  

//此时的baseInfo是响应式的, 添加readonly是为了防止孙子组件直接修改值
provide('baseInfo', readonly(baseInfo));

//son
import { inject } from 'vue';

const info = inject('baseInfo');
console.log(info); //{ name:"张三", age:12, updateInfo: function }

const changeValue = () => {
    info.updateInfo();
};

slot (vue 内置组件)

属性:

  • name - string, 用于具名插槽

用法:

1 、基本使用和默认值
//父组件
<div>
    <child-com>只有子组件有插槽我就显示</child-com>
</div>

//子组件child-com
<div>
    <slot>我是插槽默认值</slot>
</div>

//页面显示
只有子组件有插槽我就显示
2 、具名插槽

v-slot:插槽名 可以简写为 #插槽名

动态插槽名: v-slot:[dynamicSlotName]

//父组件
<div>
    <child-com>
        <template v-slot:header>头部1111</template>
        <template #center>中间222</template>
        <template #footer>底部333</template>
    </child-com>
</div>

//子组件child-com
<div>
    <div class="top">
        上边显示:
        <slot name="header"></slot>
    </div>
    <div class="center">
        中间显示:
        <slot name="center"></slot>
    </div>
    <div class="bottom">
        底部显示:
        <slot name="footer"></slot>
    </div>
</div>

//页面显示
上边显示:头部1111
中间显示:中间222
底部显示:底部333
3 、作用域插槽

子组件的数据可以在父组件中使用

使用场景:
当一个组件被用来渲染一个数组元素时,我们使用插槽,并且希望插槽中没有显示每项的内容;

//父组件
<div>
    <child-com>
        <template #title="scope">
            <h1>{{ scope.msg }}</h1>
        </template>
        <template v-slot:default="{ row, index }">
            <span>{{ index }}、</span>
            <span>{{ row.name }}</span>
            -
            <span>{{ row.age }}</span>
        </template>
    </child-com>
</div>

//子组件child-com
<div>
    <slot :msg="data.msg" name="title"></slot>
    <div v-for="(item, index) in data.list" :key="index">
        <slot :row="item" :index="index"></slot>
    </div>
</div>
import { reactive } from 'vue';
const data = reactive({
    msg: 'hello world',
    list: [
        {
            name: 'jane',
            age: 12
        },
        {
            name: 'xiaoming',
            age: 18
        }
    ]
});

//页面显示
hello world
0、jane - 12
1、xiaoming - 18

teleport (vue 内置组件)

功能:能够将我们的模板或者组件移动到相应的 DOM 元素中

属性:

  • to - string, 必须是有效的目标元素,例如:body、#some-id、.some-class
  • disabled - boolean, 为 true 表示移动到 to 指定的目标元素, false 表示不移动,

用法:

<teleport to="body">
    <div class="model"></div>
</teleport>

<teleport to="#app">
    <child-component name="hero"></child-component>
</teleport>

注意事项:

  • 被移动的组件不会影响传值
  • 在同一目标上使用多个 teleport,实际上是一个追加的过程
  • 如果在组件上动态切换 disabled 的值,并不会导致其销毁和重新创建

transition (vue 内置组件)

复习 css:
缩写: transition: property duration timing-function delay;

  • transition-property
  • transition-duration
  • transition-timing-function: linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n);
  • transition-delay
属性
  • name - string 用于自动生成 CSS 过渡类名

  • appear - boolean 是否在初始渲染时使用过渡。默认为 false。

  • css - boolean 是否使用 CSS 过渡类。默认为 true。如果设置为 false,将只通过组件事件触发注册的 JavaScript 钩子

  • type - string 指定过渡事件类型。可选值 "transition" 和 "animation"。默认自动检测出持续时间长的为过渡事件类型。

  • mode - string 控制离开/进入过渡的时间序列。有效的模式有 "out-in" 和 "in-out"

    • 为了解决两个元素相互显示时,会同时执行过渡

css 过渡 和 css 动画
//html
<div id="demo">
  <button @click="show = !show">
    Toggle
  </button>

  <transition name="fade">
    <p v-if="show">hello</p>
  </transition>
</div>

//css过渡
.fade-enter-active,
.fade-leave-active {
  transition: all 1s ease;
}

.fade-enter-active,
.fade-leave-active {
    transition: all 1s;
}

.fade-enter-from {
    transform: translateY(200px);
    opacity: 0;
}
.fade-leave-to {
    transform: translateX(200px);
    opacity: 0;
}

//css动画
.fade-enter-active {
    animation: bounce-in 1s;
}

.fade-leave-active {
    animation: bounce-in 1s reverse;
}

@keyframes bounce-in {
    0% {
        transform: scale(0);
    }
    50% {
        transform: scale(1.25);
    }
    100% {
        transform: scale(1);
    }
}
使用 三方库 animate.css
//安装 版本记录 4.1.1
npm install animate.css --save
//引入
import 'animate.css';

自定义过渡类名:
enter-from-class
enter-active-class
enter-to-class
leave-from-class
leave-active-class
leave-to-class

使用:

<transition
    enter-active-class="animate__animated animate__tada"
    leave-active-class="animate__animated animate__bounce"
>
    <div v-show="flag">hello world</div>
</transition>
transition 的 JavaScript 钩子
<transition
  @before-enter="beforeEnter"
  @enter="enter"
  @after-enter="afterEnter"
  @enter-cancelled="enterCancelled"
  @before-leave="beforeLeave"
  @leave="leave"
  @after-leave="afterLeave"
  @leave-cancelled="leaveCancelled"
  :css="false"
>
  <!-- ... -->
</transition>

Setup() 函数特性

setup() 函数接收两个参数:props、context(包含attrs、slots、emit)
setup()函数处于生命周期 beforeCreated 两个钩子函数之前
执行setup时,组件实例尚未被创建(在setup()内部,this不会是该活跃实例的引用,即不指向vue 实例,Vue 为了避免我们错误的使用,直接将setup 函数中的this 修改成了undefined)
与模版一起使用时,需要返回一个对象
因为setup函数中,props时响应式得,当传入新的prop时,它就会被更新,所以不能使用es6解构,因为它会消除 prop得响应性,如果需要解构prop,可以通过使用setup函数中torefs 来完成此操作。
在setup()内使用响应式数据时,需要通过.value 获取
从setup()中返回得对象上得property 返回并且可以在模版中被访问时,它将自动展开为内部值。不需要在模版中追加.value.
Setup 函数只能是同步的不能是异步的。

vue2和vue3的不同之处

1.双向数据绑定原理不同
Vue2 的双向数据绑定是利用ES5的一个APIObject.definePropert() 对数据进行劫持,结合发布订阅模式的方式来实现的。

Vue3 中使用ES6的Proxy API对数据代理。

Vue3 使用数据代理的优势有以下几点:1)definePropert 只能监听某个属性,不能对整个对象进行监听 2)可以省去for in,闭包等内容来提升效率(直接绑定整个对象即可)3)可以监听数组,不用再单独的对数组做特异性操作,Vue3可以检测到数组内部数据的变化

2.是否支持碎片
Vue2 不支持碎片。Vue3 支持碎片,就是说可以拥有多个根节点

3.API 类型不同
Vue2 使用选项类型api,选项型api 在代码里分割了不同的属性:data,computed,method等。

Vue3 使用合成型api,新的合成型api 能让我们使用方法来分割,相比于旧的api 使用属性来分组,这样代码会更加简便和整洁。

4定义数据变量和方法不同
Vue2是把数据放到了data 中,在 Vue2中 定义数据变量是data(){},创建的方法要在method:{}

Vue3 就需要使用一个新的setup()方法,此方法在组件初始化构造的时候触发。使用以下三个步骤来建立反应性数据:1)从vue 引入 reactive;2)使用 reactive ()方法来声明数据为响应性数据;3) 使用setup()方法来返回我们的响应性数据,从而template 可以获取这些响应性数据。

5.生命周期钩子函数不同
Vue2 中的生命周期:beforeCreate 组件创建之前;created 组建创建之后;beforeMount 组件挂载到页面之前执行;Mounted 组件挂载到页面之后执行,beforeUpdate 组件更新之前;updated组件更新之后

Vue3 中的生命周期:setup 开始创建组件;onBeforeMount 组件挂载到页面之前执行;onMounted 组件挂载到页面之后执行;onBeforeUpdate 组件更新之前;onUpdated 组件更新之后;

而且 Vue3 生命周期在调用前需要先进行引入。除了这些钩子函数外,Vue3 还增加了 onRenderTracked 和onRenderTriggered 函数。

6.父子传参不同
Vue2 父传子,用props ;子传父用事件Emitting Events。在Vue2 中,会调用this$emit 然后传入事件名和对象。

Vue3 父传子,用props;子传父用Emitting Events 。在Vue3 中的setup()中的第一参数content 对象中就有 emit,那么我们只要在setup()接收第二个参数中使用分解对象法取出emit 就可以在setup 方法中随意使用了。

7.指令与插槽不同
Vue2 中使用slot 可以直接使用slot ;v-for 与v-if 在Vue2中优先级高的是v-for 指令,而且不建议一起使用。

Vue3 中必须是使用v-slot的形式;vue 3中v-for 与v-if ,只会把当前v-if 当作v-for 的一个判断语句,不会相互冲突;

Vue3 中移除keyCode 作为v-on 的修饰符,当然也不支持config.keyCodes,取而代之的是使用键名来作为事件的修饰符来使用,于是Vue.config.keyCodes 也被弃用了-vue2我们在监听按键事件的时候,是可以通过在事件后面加上按键码来实现监听某一个按键的

8.Main.js 文件不同

Vue2中我们可以使用pototype(原型)的形式去进行操作,引入的是构造函数。

Vue3 中需要使用结构的形式进行操作,引入的是工厂函数;

Vue3中app组件中可以没有根标签。

Vue3中获取组件实例的方法

1、使用$ref获取实例

Vue3中使用$ref获取组件实例跟Vue2的用法基本一致,只不过需要使用Vue3提供的ref函数来进行实例的绑定。下面我们将通过示例来演示如何使用$ref获取组件实例。

const app = Vue.createApp({
    setup() {
      const myComponentRef = Vue.ref(null);
      return {
        myComponentRef
      };
    }
  });

  app.component('my-component', {
    template: `
      
{{ message }}

    `,
    data() {
      return {
        message: 'Hello World!'
      };
    }
  });

  const vm = app.mount('#app');
  
  // 获取组件实例
  const myComponentInstance = vm.$refs.myComponentRef;
  console.log(myComponentInstance.message); // Hello World!

2、使用provide/inject获取实例

Vue3中提供了provide/inject来进行组件之间的依赖注入。我们可以在父组件中provide某个实例,在子组件中使用inject来获取这个实例。下面我们将通过示例来演示如何使用provide/inject获取组件实例。

// 父组件
const app = Vue.createApp({
  provide() {
    return {
      myService: Vue.ref(null)
    };
  },
  mounted() {
    this.$refs.myComponentRef.initService(this.myService);
  }
});

app.component('my-component', {
  template: `
    
{{ message }}

  `,
  props: ['initService'],
  mounted() {
    this.initService(this.myService);
  },
  data() {
    return {
      message: 'Hello World!'
    };
  },
  setup() {
    const myService = Vue.ref(null);
    return {
      myService
    };
  }
});

// 子组件
app.component('my-other-component', {
  template: `
    
{{ myService.message }}

  `,
  inject: ['myService']
});

const vm = app.mount('#app');

3、使用v-for获取多个实例

如果我们需要获取多个组件实例,我们可以使用v-for来遍历一个组件数组,然后在每个组件上使用v-slot来获取实例。下面我们将通过示例来演示如何使用v-for获取多个组件实例。

const app = Vue.createApp({
  setup() {
    const myComponents = Vue.ref([{
      message: 'Hello World!'
    }, {
      message: 'Hello Vue3!'
    }]);
    return {
      myComponents
    };
  }
});

app.component('my-component', {
  template: `
    
{{ message }}

  `,
  props: ['myComponent'],
  data() {
    return {
      message: this.myComponent.message
    };
  }
});

const vm = app.mount('#app');

// 遍历组件数组
<template v-for="(myComponent, index) in myComponents">
  <my-component :key="index" :my-component="myComponent" v-slot="{ $ }">
    <button @click="$refs[index].message = 'Hello AI!'">Change Message</button>
  </my-component>
</template>

// 获取组件实例
const myComponentInstance1 = vm.$refs[0];
const myComponentInstance2 = vm.$refs[1];
console.log(myComponentInstance1.message); // Hello World!
console.log(myComponentInstance2.message); // Hello Vue3!

4、使用async/await获取动态组件实例

如果我们需要获取一个动态创建的组件实例,我们可以使用async/await来等待组件创建完成,然后使用$refs获取组件实例。下面我们将通过示例来演示如何使用async/await获取动态组件实例。

const app = Vue.createApp({
  setup() {
    const compName = Vue.ref('my-component');
    const loadComponent = async () => {
      const { default: dynamicComponent } = await import('./DynamicComponent.vue');
      app.component('dynamic-component', dynamicComponent);
    };
    return {
      compName,
      loadComponent
    };
  }
});

app.component('my-component', {
  template: `
    
{{ message }}

  `,
  data() {
    return {
      message: 'Hello World!'
    };
  }
});

const vm = app.mount('#app');

// 使用async/await等待组件创建完成
vm.loadComponent().then(() => {
  const dynamicComponentInstance = vm.$refs.dynamicComponent.$refs['my-dynamic-component'];
  console.log(dynamicComponentInstance.message); // Hello Dynamic Component!
});

// 动态组件
<dynamic-component>
  <my-component ref="my-dynamic-component"></my-component>
</dynamic-component>

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

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

相关文章

Java基于SpringBoot的在线考试系统

文章目录 第一章第二章.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数据库表 第五章 系统功能实现5.1系统登录注册5.2管理员功能模块 六 源码咨询 第一章 在线考试的需求和管理上的不断提升&#xff0c;在线考试管理的潜力将无限扩大&…

什么是业务流程图(TFD),数据字典(DD),数据流程图(DFD)

什么是业务流程图&#xff08;TFD&#xff09;&#xff0c;数据字典&#xff08;DD&#xff09;&#xff0c;数据流程图&#xff08;DFD&#xff09;&#xff1f; 答: TFD是一种描述系统内各单位、人员之间的业务关系、作业顺序和管理流向的图表&#xff0c;利用它可以帮助分析…

[CISCN2019 华北赛区 Day1 Web5]CyberPunk 二次报错注入

buu上 做点 首先就是打开环境 开始信息收集 发现源代码中存在?file 提示我们多半是包含 我原本去试了试 ../../etc/passwd 失败了 直接伪协议上吧 php://filter/readconvert.base64-encode/resourceindex.phpconfirm.phpsearch.phpchange.phpdelete.php 我们通过伪协议全…

Adobe Premiere Pro:掌控视频剪辑的魔法之手,让你的创作腾飞!

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

OnlyOffice修改上传文件大小限制

安装OnlyOffice 安装OnlyOffice&#xff0c;请移步&#xff1a;参考链接 进入docker容器 docker exec -it 容器名ID bash 编辑配置文件 #如果不能编辑,需安装vim apt-get update apt-get install vim #如果不能安装vim&#xff0c;可以在容器外部编辑配置文件后上传至容…

jackson的@JsonIgnore注解和@JsonFormat注解混用导致不生效问题

昨天新建了一个表&#xff0c;就从别的地方复制了一个实体类&#xff0c;然后给一个时间属性加了了JsonIgnore注解&#xff0c;发现前端还是能拿到这个被忽略的属性。 最后排查发现&#xff0c;这两个注解不能混用&#xff0c;两个注解同时加上的效果等同于不加。同时加上&…

阅读论文:Label-Free Liver Tumor Segmentation

论文标题&#xff1a;Label-Free Liver Tumor Segmentation 翻译&#xff1a;无标记的肝肿瘤分割 摘要 论文的目的&#xff1a;肿瘤合成&#xff0c;通过使用合成数据来改进医学图像分析和AI在肝脏肿瘤检测方面的性能 我们的主要贡献是合成了一种肿瘤生成器&#xff0c;它提…

当GPT遇到程序分析:在GPTScan中实现智能合约逻辑漏洞检测

源自&#xff1a;安全学术圈 “人工智能技术与咨询” 发布 研究背景 漏洞案例 研究方法 实验 数据集 讨论 贡献总结 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨&#xff0c;并不意味着支持其观点或证实其内容的真实性。版权归原作者所有&a…

适老产品反“坑老”,美的智能化家电是否能坐稳银发经济顺风车?

随着我国老龄化程度不断加深&#xff0c;银发经济崛起早已成为不争的共识。早在2013年&#xff0c;《中国老年人家电需求研究报告》就曾预测&#xff0c;仅在城镇空巢老年人家庭&#xff0c;每年产生的老年家电需求规模就超过600亿元&#xff0c;加上非空巢老人的需求&#xff…

OpenHarmony后代组件双向同步,跨层级传递:@Provide装饰器和@Consume装饰器

Provide和Consume&#xff0c;应用于与后代组件的双向数据同步&#xff0c;应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递&#xff0c;Provide和Consume摆脱参数传递机制的束缚&#xff0c;实现跨层级传递。 其中Provide装饰的变…

为Xshell生成密钥,实现免密登录远程Linux服务器

1、为Xshell生成密钥 依次打开Xshell-->工具-->新建用户密钥生成向导。 打开如下图所示的生产密钥参数窗口。 按默认参数&#xff0c;直接单击“下一步”按钮&#xff0c;直到如下图所示的用户密钥信息对话框。 在该界面&#xff0c;可以设置密钥名称&#xff0c;并设置…

干洗店管理软件,洗衣洗鞋小程序开发搭建;

干洗店管理软件&#xff0c;洗衣洗鞋小程序开发搭建&#xff1b;可以帮助干洗店/洗鞋店店主们省心高效的管理店铺&#xff0c;一次付款长期使用&#xff0e;功能基本涵盖收衣、取衣录入、财务管理、基础数据维护、查询、统计&#xff0c;会员管理等方面&#xff1b; 一、干洗店…

【算法小课堂】二分查找算法

简单思路&#xff1a; 当我们要从一个序列中查找一个元素的时候&#xff0c;最快想到的方法就是顺序查找法&#xff08;即&#xff1a;从前到后依次查找&#xff09;。但这种方法过于无脑&#xff0c;就是暴力的把每个元素都排查一遍。元素个数少的时候还行&#xff0c;一旦元…

敲代码之余的表情包

欢迎来到上班休息区&#xff0c;请交出你的程序员专属表情包&#xff01;你可以从以下几个方面进行创作&#xff08;仅供参考&#xff09;此为内容创作模板&#xff0c;在发布之前请将不必要的内容删除 方向一&#xff1a;分享你最喜欢的表情包 提示&#xff1a;请至少分享5个…

SQLServer 重置自动增长列增值

--查询标识值 DBCC CHECKIDENT(TypeConf, NORESEED)--重置标识值 DBCC CHECKIDENT(TypeConf, RESEED, 8)

【Vue】vscode格式刷插件Prettier以及配置项~~保姆级教程

文章目录 前言一、下载插件二、在项目内创建配置文件1.在根目录创建&#xff0c;src同级2.写入配置3.每个字段含义 总结 前言 vscode格式刷&#xff0c;有太多插件了&#xff0c;但是每个的使用&#xff0c;换行都不一样。 这里我推荐一个很多人都推荐了的Prettier 一、下载插…

中小企业车间生产管理方案

车间生产管理&#xff0c;员工该如何做&#xff1f;工厂效率上不去&#xff0c;应该怎么提高&#xff1f; 与其靠人力&#xff0c;不如靠“外力”&#xff0c;通过流程化的生产管理系统&#xff0c;将每个流程都置于规范的管理下&#xff0c;优化制造业务流程&#xff0c;整合…

Android开发-Android项目Jenkins自动化打包流程搭建与配置

Android 项目 Jenkins 自动化打包流程搭建与配置 1. 前言2. Jenkins 下载3. 配置电脑的 JDK 环境4. Jenkins 安装和设置5. Jenkins 设置 Android 项目自动打包流程 1. 前言 由于之前公司的 Android 项目需要 APK 自动打包的功能&#xff0c;所以需要搭建 Jenkins 自动化打包的…

TikTok创意大赛:如何制作病毒性视频

随着社交媒体的崛起&#xff0c;TikTok已成为年轻一代最受欢迎的平台之一。这个以短视频为主要内容的应用程序不仅改变了人们的娱乐方式&#xff0c;还为创作者提供了一个展示创意的舞台。 其中&#xff0c;TikTok创意大赛成为吸引创作者的一个独特机会。在本文中&#xff0c;…

SAP-MM-委外订单合并有什么不同?

计划下了两个委外采购申请&#xff0c;用ME59N合并时会有哪些不同&#xff1f; 1、采购申请2个都是委外采购申请&#xff0c;有BOM组件 因为两个采购申请的条件一致&#xff0c;所以在转采购订单ME59时&#xff0c;会被合并 但是合并之后&#xff0c;BOM组件却不显示了