vue3常用API之学习笔记

目录

一、setup函数

vue2与vue3变量区别

二、生命周期

三、reactive方法

四、ref方法

1、简介

2、使用

3、ref与reactive

4、获取标签元素或组件

五、toRef

1、简介

2、ref与toRef的区别

六、toRefs

七、shallowReactive 浅reactive

1、简介

2、shallowreactived的浅reactive

八、shallowRef

1、简介

2、triggerRef

九、toRaw方法

十、markRaw

十一、provide && inject

1、简介

2、代码实例

十二、watch && watchEffect

1、watch 简介

2、watchEffect与 watch 的区别

十三、getCurrentInstance

1、输出值ctx

2、输出值proxy

十四、useStore


一、setup函数

<template>
  <div id="app">
      <p>{{ number }}</p>
      <button @click="add">增加</button>
  </div>
</template>

<script>
// 1. 从 vue 中引入 ref 函数
import {ref} from 'vue'
export default {
  name: 'App',
  setup() {
      // 2. 用 ref 函数包装一个响应式变量 number
    let number = ref(0)

    // 3. 设定一个方法
    function add() {
        // number是被ref函数包装过了的,其值保存在.value中
        number.value ++
    }

    // 4. 将 number 和 add 返回出去,供template中使用
    return {number, add}
  }

}
</script>

vue2与vue3变量区别

1、vue2访问data或props中的变量,需要通过this

2、vue3的setup函数有两个参数,分别是props、context

(1)props:存储定义当前组件允许外界传递来的参数名及参数值

(2)context:上下文对象,能从中访问到attr、emit、slots

        【emit就是vue2中父组件通信的方法,可以直接拿来调用】


二、生命周期

Vue2

Vue3

beforeCreate

setup

created

setup

beforeMount

onBeforeMount

mounted

onMounted

beforeUpdate

onBeforeUpdate

updated

onUpdated

beforeDestory

onBeforeUnmount

destoryed

onUnmounted

vue3生命周期的使用,也是先从vue中导入,再进行直接调用

<template>
  <div id="app"></div>
</template>

<script>
// 1. 从 vue 中引入 多个生命周期函数
import {onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, unMounted} from 'vue'
export default {
  name: 'App',
  setup() {
    onBeforeMount(() => {
        // 在挂载前执行某些代码
    })

    onMounted(() => {
        // 在挂载后执行某些代码
    })

    onBeforeUpdate(() => {
        // 在更新前前执行某些代码
    })

    onUpdated(() => {
        // 在更新后执行某些代码
    })

    onBeforeUnmount(() => {
        // 在组件销毁前执行某些代码
    })

    unMounted(() => {
        // 在组件销毁后执行某些代码
    })

    return {}
  }

}
</script>

三、reactive方法

用来创建一个响应式数据对象,该API也很好地解决了Vue2通过 defineProperty 实现数据响应式的缺陷

<template>
  <div id="app">
      <!-- 4. 访问响应式数据对象中的 count  -->
      {{ state.count }}
  </div>
</template>

<script>
// 1. 从 vue 中导入 reactive 
import {reactive} from 'vue'
export default {
  name: 'App',
  setup() {
      // 2. 创建响应式的数据对象
    const state = reactive({count: 3})

    // 3. 将响应式数据对象state return 出去,供template使用
    return {state}
  }
}
</script>

四、ref方法

1、简介

包装了一个响应式的数据对象,ref是通过 reactive 包装了一个对象,然后是将值传给该对象中的 value 属性

注意:.value是在访问ref方法才需要,在template模板是不需要的

2、使用

可以简单地把 ref(obj) 理解为这个样子 reactive({value: obj})

<script>
import {ref, reactive} from 'vue'
export default {
  name: 'App',
  setup() {
      const obj = {count: 3}
      const state1 = ref(obj)
      const state2 = reactive(obj)

    console.log(state1)
    console.log(state2)
  }

}
</script>

3、ref与reactive

(1)基本类型值(string、number、boolean等)或单值对象(像{count:3}只有一个属性值的)使用ref

(2)引用类型值(object、array)使用reactive

4、获取标签元素或组件

(1)在Vue2中,我们获取元素都是通过给元素一个 ref 属性,然后通过 this.$refs.xx 来访问的,在Vue3中已经不再适用

(2)vue3获取元素如下

<template>
  <div>
    <div ref="el">div元素</div>
  </div>
</template>
<script>
import {ref,onMounted} from 'vue'

export default {
  name: "SetupView",
  setup() {
    // 创建一个DOM引用,名称必须与元素的ref属性名相同
    const el = ref(null)
    // 在挂载后才能通过el获取到目标元素
    onMounted(()=>{
      el.value.innerHTML = '内容被修改'
    })
    // 把创建的引用return出去
    return {el}
  },
};
</script>

(3)获取元素的操作步骤:

补充:设置的元素引用变量只有在组件挂载后才能访问到,因此在挂载前对元素进行操作都是无效的


五、toRef

1、简介

某对象中的某值转化为响应式数据,其接收两个参数

(1)第一个参数为 obj 对象

(2)第二个参数为对象中的属性名

<template>
  <div>
    <div> {{ state }} </div>
  </div>
</template>

<script>
import { toRef } from "vue";

export default {
  name: "SetupView",
  setup() {
    const obj = { count: 3 };
    const state = toRef(obj, "count"); //注意:count有加单引号
    return { state };
  },
};
</script>

2、ref与toRef的区别

上面的例子ref也可以实现,那为什么还要toRef呢,来看看他们的区别吧

<template>
  <div>
    <p>{{ state1 }}</p>
    <button @click="add1">增加1</button>
    <p>{{ state2 }}</p>
    <button @click="add2">增加2</button>
  </div>
</template>

<script>
import { ref,toRef } from "vue";

export default {
  name: "SetupView",
  setup() {
    const obj = {count:3}
    const state1 = ref(obj.count)
    const state2 = toRef(obj,'count')

    function add1(){
        state1.value++
        console.log('ref原始值:',obj);
        console.log('ref响应式',state1);
    }
    function add2(){
        state2.value++
        console.log('toRef原始值:',obj);
        console.log('toRef响应式',state2);
    }

    return {state1,state2,add1,add2}
  },
};
</script>

(1)ref是对传入数据的拷贝;toRef是对传入数据的引用

(2)ref值会改变更新视图;toRef值改变不会更新视图


六、toRefs

将传入的对象里所有的属性的值都转化为响应式数据对象,该函数支持一个参数,即 obj 对象

<template>
  <div>
    <div>{{ state }}</div>
  </div>
</template>

<script>
import { toRefs } from "vue";

export default {
  name: "SetupView",
  setup() {
    const obj={
      name:'前端学学学',
      age:18,
      gender:0
    }

    const state = toRefs(obj)

    console.log(state);
  },
};
</script>

七、shallowReactive 浅reactive

1、简介

shallowReactive传递给reactive的obj对象不止一层,那么每一次都会用Proxy包装

<template>
  <div>
    <div>{{ state }}</div>
  </div>
</template>

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

export default {
  name: "SetupView",
  setup() {
    const obj={
      a:1,
      first:{
        b:2,
        second:{
          c:3
        }
      }
    }

    const state = reactive(obj)

    console.log(state);
    console.log(state.first);
    console.log(state.first.second);
  },
};
</script>

如果一个对象层级比较深,那么每一层都用 Proxy 包装后,对于性能是非常不友好的

2、shallowreactived的浅reactive

shallowreactive只有第一层被Proxy处理了,即只有修改第一层的值,才会响应式更新

<template>
  <div>
    <div>{{ state.a }}</div>
    <div>{{ state.first.b }}</div>
    <div>{{ state.first.second.c }}</div>

    <button @click="change1">改变1</button>
    <button @click="change2">改变2</button>
  </div>
</template>

<script>
import { shallowReactive } from "vue";

export default {
  name: "SetupView",
  setup() {
    const obj={
      a:1,
      first:{
        b:2,
        second:{
          c:3
        }
      }
    }

    const state = shallowReactive(obj)

    function change1(){
      state.a = 7
    }

    function change2(){
      state.first.b = 8
      state.first.second.c =9
      console.log(state);
    }

    return {state,change1,change2}
  },
};
</script>


八、shallowRef

1、简介

浅层ref,一样是用来做性能优化的

(1)shallowReactive 是监听对象第一层的数据变化用于驱动视图更新

(2)shallowRef 则是监听 .value 的值的变化来更新视图的

(3)代码实例

<template>
  <div>
    <div>{{ state.a }}</div>
    <div>{{ state.first.b }}</div>
    <div>{{ state.first.second.c }}</div>

    <button @click="change1">改变1</button>
    <button @click="change2">改变2</button>
  </div>
</template>

<script>
import { shallowRef } from "vue";

export default {
  name: "SetupView",
  setup() {
    const obj={
      a:1,
      first:{
        b:2,
        second:{
          c:3
        }
      }
    }

    const state = shallowRef(obj)

    console.log(state);
    function change1(){
      state.value ={
        a:7,
        first:{
          b:8,
          second:{
            c:9
          }
        }
      }
    }

    function change2(){
      state.value.first.b = 4
      state.value.first.second.c = 5
      console.log(state);
    }

    return {state,change1,change2}
  },
};
</script>

①第二个按钮点击数据改变但是视图没变

②第一个按钮将整个 .value 重新赋值,视图才更新

2、triggerRef

triggerRef可以解决上面实例的第二个按钮的问题,可以立马更新视图,其接收一个参数 state ,即需要更新的 ref 对象

<template>
  <div>
    <div>{{ state.a }}</div>
    <div>{{ state.first.b }}</div>
    <div>{{ state.first.second.c }}</div>

    <button @click="change">改变</button>
  </div>
</template>

<script>
import { shallowRef,triggerRef } from "vue";

export default {
  name: "SetupView",
  setup() {
    const obj={
      a:1,
      first:{
        b:2,
        second:{
          c:3
        }
      }
    }

    const state = shallowRef(obj)

    console.log(state);

    function change(){
      state.value.first.b = 4
      state.value.first.second.c = 5
      triggerRef(state)
      console.log(state);
    }

    return {state,change}
  },
};
</script>


九、toRaw方法

toRaw 方法是用于获取 ref 或 reactive 对象的原始数据

<template>
  <div>
    <div>{{ state.name }}</div>
    <div>{{ state.age }}</div>
    <button @click="change">改变</button>
  </div>
</template>

<script>
import { reactive,toRaw } from "vue";

export default {
  name: "SetupView",
  setup() {
    const obj={
      name:'前端学学学',
      age:18,
    }

    const state = reactive(obj)
    const raw = toRaw(state)

    function change(){
      state.age = 90
      console.log(obj);
      console.log(state);
      console.log(obj === raw);
    }
    return {state,change}
  },
};
</script>

上述代码就证明了 toRaw 方法从 reactive 对象中获取到的是原始数据,因此我们就可以很方便的通过修改原始数据的值而不更新视图来做一些性能优化了

注意: 补充一句,当 toRaw 方法接收的参数是 ref 对象时,需要加上 .value 才能获取到原始数据对象


十、markRaw

markRaw 方法可以将原始数据标记为非响应式的,即使用 ref 或 reactive 将其包装,仍无法实现数据响应式,其接收一个参数,即原始数据,并返回被标记后的数据

<template>
  <div>
    <div>{{ state.name }}</div>
    <div>{{ state.age }}</div>
    <button @click="change">改变</button>
  </div>
</template>

<script>
import { reactive, markRaw } from "vue";

export default {
  name: "SetupView",
  setup() {
    const obj = {
      name: "前端学学学",
      age: 18,
    };
    // 通过markRaw标记原始数据obj, 使其数据更新不再被追踪
    const raw = markRaw(obj);
    // 试图用reactive包装raw, 使其变成响应式数据
    const state = reactive(raw);

    function change() {
      state.age = 90;
      console.log(state);
    }
    return { state, change };
  },
};
</script>

被 markRaw 方法处理过后的数据不能被 reactive 包装成响应式数据,修改了值也不会更新视图了,即没有实现数据响应式


十一、provide && inject

1、简介

  • provide :向子组件以及子孙组件传递数据。接收两个参数,第一个参数是 key,即数据的名称;第二个参数为 value,即数据的值
  • inject :接收父组件或祖先组件传递过来的数据。接收一个参数 key,即父组件或祖先组件传递的数据名称

2、代码实例

假设这有三个组件,分别是 A.vue 、B.vue 、C.vue,其中 B.vue 是 A.vue 的子组件,C.vue 是 B.vue 的子组件

// A.vue
<script>
import {provide} from 'vue'
export default {
    setup() {
        const obj= {
            name: '前端印象',
            age: 22
        }

        // 向子组件以及子孙组件传递名为info的数据
        provide('info', obj)
    }
}
</script>

// B.vue
<script>
import {inject} from 'vue'
export default {
    setup() {    
        // 接收A.vue传递过来的数据
        inject('info')  // {name: '前端印象', age: 22}
    }
}
</script>

// C.vue
<script>
import {inject} from 'vue'
export default {
    setup() {    
        // 接收A.vue传递过来的数据
        inject('info')  // {name: '前端印象', age: 22}
    }
}
</script>

十二、watch && watchEffect

watch 和 watchEffect 都是用来监视某项数据变化从而执行指定的操作的,但用法上还是有所区别

1、watch 简介

watch 格式:watch( source, cb, [options])

  • source:可以是表达式或函数,用于指定监听的依赖对象
  • cb:依赖对象变化后执行的回调函数
  • options:可参数,可以配置的属性有 immediate(立即触发回调函数)、deep(深度监听)

(1)监听ref类型时:

<script>
import { ref, watch } from "vue";

export default {
  name: "SetupView",
  setup() {
    const state = ref(0);

    watch(state, (newValue, oldValue) => {
      console.log(`原值${oldValue}`);
      console.log(`新值${newValue}`);
    });
    // 1秒后值+1
    setTimeout(() => {
      state.value++;
    }, 1000);
  },
};
</script>

(2)监听reactive类型时:

<script>
import { reactive, watch } from "vue";

export default {
  name: "SetupView",
  setup() {
    const state = reactive({count:0});

    watch(()=>state.count,(newValue,oldValue)=>{
      console.log(`原值${oldValue}`);
      console.log(`新值${newValue}`);
    });
    // 1秒后值+1
    setTimeout(() => {
      state.count++;
    }, 1000);
  },
};
</script>

(3)当同时监听多个值时:

<script>
import { reactive, watch } from "vue";

export default {
  name: "SetupView",
  setup() {
    const state = reactive({count:0,name:'23'});

    watch([()=>state.count,()=>state.name],([newCount,newName],[oldCount,oldName])=>{
      console.log(oldCount);
      console.log(newCount);
      console.log(oldName);
      console.log(newName);
    });
    // 1秒后值+1
    setTimeout(() => {
      state.count++;
      state.name = 'sxx'
    }, 1000);
  },
};
</script>

(4)因为 watch 方法的第一个参数我们已经指定了监听的对象,因此当组件初始化时,不会执行第二个参数中的回调函数,若我们想让其初始化时就先执行一遍,可以在第三个参数对象中设置 immediate: true

(5)watch 方法默认是渐层的监听我们指定的数据,例如如果监听的数据有多层嵌套,深层的数据变化不会触发监听的回调,若我们想要其对深层数据也进行监听,可以在第三个参数对象中设置 deep: true

(6)watch方法会返回一个stop方法,若想要停止监听,便可直接执行该stop函数

2、watchEffect与 watch 的区别

(1)不需要手动传入依赖

(2)每次初始化时会执行一次回调函数来自动获取依赖

(3)无法获取到原值,只能得到变化后的值

<script>
import { reactive, watchEffect } from "vue";

export default {
  name: "SetupView",
  setup() {
    const state = reactive({count:0,name:'23'});

    watchEffect(()=>{
      console.log(state.count);
      console.log(state.name);
    })
    // 1秒后值+1
    setTimeout(() => {
      state.count++;
      state.name = 'sxx'
    }, 1000);
  },
};
</script>

没有像 watch 方法一样先给其传入一个依赖,而是直接指定了一个回调函数

当组件初始化时,该回调函数会执行一次,自动获取到需要检测的数据


十三、getCurrentInstance

<template>
  <div>
    <div>{{ num }}</div>
  </div>
</template>
<script>
import { ref,getCurrentInstance } from "vue";

export default {
  name: "SetupView",
  setup() {
    const num = ref(3)
    const instance = getCurrentInstance()
    console.log(instance);
    return {num}
  },
};
</script>

1、输出值ctx

2、输出值proxy

ctx 和 proxy 的内容十分类似,只是后者相对于前者外部包装了一层 proxy,由此可说明 proxy 是响应式的


十四、useStore

通过vuex中的useStore方法

// store 文件夹下的 index.js
import Vuex from 'vuex'

const store = Vuex.createStore({
    state: {
        name: '前端印象',
        age: 22
    },
    mutations: {
        ……
    },
    ……
})

// example.vue
<script>
// 从 vuex 中导入 useStore 方法
import {useStore} from 'vuex'
export default {
    setup() {    
        // 获取 vuex 实例
        const store = useStore()

        console.log(store)
    }
}
</script>

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

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

相关文章

Debian 12.1 “书虫 “发布,包含 89 个错误修复和 26 个安全更新

导读Debian 项目今天宣布&#xff0c;作为最新 Debian GNU/Linux 12 “书虫 “操作系统系列的首个 ISO 更新&#xff0c;Debian 12.1 正式发布并全面上市。 Debian 12.1 是在 Debian GNU/Linux 12 “书虫 “发布六周后推出的&#xff0c;目的是为那些希望在新硬件上部署操作系统…

JMeter发送get请求并分析返回结果

在实际工作的过程中&#xff0c;我们通常需要模拟接口&#xff0c;来进行接口测试&#xff0c;我们可以通过JMeter、postman等多种工具来进行接口测试&#xff0c;但是工具的如何使用对于我们来说并不是最重要的部分&#xff0c;最重要的是设计接口测试用例的思路与分析结果的能…

硬核来袭!中国AI大模型峰会“封神之作”,开发者们不容错过!

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

PDF文件忘记密码,怎么办?

PDF文件设置密码分为打开密码和限制密码&#xff0c;忘记了密码分别如何解密PDF密码&#xff1f; 如果是限制编辑密码忘记了&#xff0c;我们可以试着将PDF文件转换成其他格式来避开限制编辑&#xff0c;然后重新将文件转换回PDF格式就可以了。 如果因为转换之后导致文件格式…

MapBox 做聚合图点位聚合效果实现教程

最近收到一个需求&#xff0c;要对 5000的点位进行展示。直接展示的话满屏幕都是点&#xff0c;效果太丑&#xff0c;于是想到了聚合&#xff0c;聚合有很多种方案。首先你可以手动的些代码来计算某个范围内的点的数量然后再把聚合的结果展示在这个范围的某个位置。这针对于简单…

PMP证书查询 ACP证书查询 PMP/ACP证书查询 PMP证书真伪查询 ACP证书真伪查询PMI证书查询

PMP证书查询 ACP证书查询 PMP/ACP证书查询 PMP证书真伪查询 ACP证书真伪查询PMI证书查询 一、查询步骤 1、地址&#xff1a; https://www.pmi.org/certifications/certification-resources/registry 2、查询截图&#xff1a; 2.1、证书类型如下&#xff1a; 3、查到证书 4、没…

python语言程序设计基础(第2版)课后答案

这篇文章主要介绍了python语言程序设计基础第二版课后答案&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 第一章 初识Python 1.1学好Python的关键 刷代码&#xff1a;寻找一个…

安科瑞电动机保护器产品在污水处理厂的应用-安科瑞黄安南

应用场景 功能 1&#xff09;排污泵经常会出现过载、缺相等问题&#xff0c;导致电机烧坏&#xff1b; 2&#xff09;为电动机提供完善的保护&#xff0c;并具备多种事件记录追忆功能&#xff1b; 3&#xff09;全电参量测量&#xff0c;包括但不限于三相电流、三相电压、有…

简约好看的帮助中心创建案例,赶紧点赞收藏!

在线帮助中心创建案例是提供用户支持和解决问题的有效方式之一。一个简约好看的帮助中心案例能够帮助用户快速找到需要的信息并解决问题&#xff0c;同时也能提升用户体验&#xff0c;增加点赞和收藏的可能性。 帮助中心创建案例分享&#xff1a; 酷学院&#xff1a; 酷渲&a…

这款轻量级规则引擎,真香!

大家好&#xff0c;我是老三&#xff0c;之前同事用了一款轻量级的规则引擎脚本AviatorScript&#xff0c;老三也跟着用了起来&#xff0c;真的挺香&#xff0c;能少写很多代码。这期就给大家介绍一下这款规则引擎。 简介 AviatorScript 是一门高性能、轻量级寄宿于 JVM &…

决策树的划分依据之:信息增益率

在上面的介绍中&#xff0c;我们有意忽略了"编号"这一列.若把"编号"也作为一个候选划分属性&#xff0c;则根据信息增益公式可计算出它的信息增益为 0.9182&#xff0c;远大于其他候选划分属性。 计算每个属性的信息熵过程中,我们发现,该属性的值为0, 也就…

2023年的深度学习入门指南(24) - 处理音频的大模型 OpenAI Whisper

2023年的深度学习入门指南(24) - 处理音频的大模型 OpenAI Whisper 在这一讲之前&#xff0c;我们所用的大模型都是针对文本的。这一讲我们增加一个新的领域&#xff0c;即音频。我们将介绍OpenAI的Whisper模型&#xff0c;它是一个处理音频的大模型。 Whisper模型的用法 Wh…

【Linux】yum工具的认识及使用

【Linux】yum工具的认识及使用 1.知识点补充2.yum是什么3.yum常用指令3.1查看软件安装包3.1.1关于rzsz 3.2安装软件3.3卸载软件 4.yum扩展4.1扩展14.2扩展24.3扩展3 什么是工具&#xff1f; 本质上也是指令 1.知识点补充 1.我们一般安装软件&#xff0c;是不是需要把软件安装…

【C++】开源:Linux端V4L2视频设备库

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

正则表达式在格式校验中的应用以及包装类的重要性

文章目录 正则表达式&#xff1a;做格式校验包装类&#xff1a;在基本数据类型与引用数据类型间的桥梁总结 在现代IT技术岗位的面试中&#xff0c;掌握正则表达式的应用以及理解包装类的重要性是非常有益的。这篇博客将围绕这两个主题展开&#xff0c;帮助读者更好地面对面试挑…

DoIP学习笔记系列:(一)DoIP协议概述

文章目录 1. 为什么会有DoIP协议的需求产生?2. DoIP协议入门2.1 传输层协议和网络层服务2.2 物理层和数据链路层2.3 协议介绍2.3.1 报文封装结构2.3.2 端口号2.3.3 DoIP报文格式2.3.3.1 DoIP首部,协议版本号2.3.3.2 DoIP首部,协议版本号取反2.3.3.3 DoIP首部,负载类型2.3.3…

未能加载导入的项目文件,缺少根元素

项目场景&#xff1a; VS2019开发过程中&#xff0c;由于操作不当或其他原因导致报错。 问题描述 解决方案&#xff1a; 找到同名文件&#xff0c;删除即可

树莓派微型 web 服务器——正式设计报告

树莓派微型web服务器 摘要 这篇博客介绍了一个基于树莓派的轻量级服务器项目。树莓派是一款低成本、小型化的单板计算机&#xff0c;具有较低的功耗和良好的可扩展性。该项目利用树莓派搭建了一个功能简洁但性能稳定的服务器环境&#xff0c;适用于小型应用或个人使用。该轻量…

AD21 PCB设计的高级应用(八)Draftsman的应用

&#xff08;八&#xff09;Draftsman的应用 1.创建Draftsman文档2.Draftsman页面选项设置3.放置绘图数据3.1 装配图3.2 板制造图3.3 钻孔图和钻孔列表3.4 图层堆栈图例3.5 BOM3.6 标注、注释、测量尺寸 4.文档输出4.1 打印或者导出为PDF4.2 添加到Output job Draftsman 是为电…

GifGun for Mac插件,帮你输出GIF动画格式

GifGun for Mac是一款安装在After Effects中使用的AE快速输出GIF动图格式插件&#xff0c;你可以使用gifgun插件直接输出GIF动画格式&#xff0c;支持自定义GIF文件的大小、帧数率等各种属性&#xff01; AE插件下载-GifGun for Mac(AE快速输出GIF动图格式插件)支持AE 2022- Ma…