VUE3组合式API

vue3 优雅的拆分逻辑小技巧 逻辑拆分, vue2 使用 mixin,vue3 使用组合式函数 ,同时也是最小全局状态管理库; 阅读详情

介绍

Vue3提供两种组织代码逻辑的写法:

1、通过data、methods、watch 等配置选项组织代码逻辑是 选项式API 写法。所谓选项式就是你只能在vue 提供的组件封装对象的对应属性中书写代码。比如:

<script>
export default {
  // data 属性中定义组件状态
  data() {
  },
  // methods 属性中定义组件的事件处理函数
  methods: {
  },
  // mounted 生命周期函数中获取 DOM
  mounted(){
  }
};
</script>

 2、所有逻辑写在 setup 函数中,使用 ref、watch 等函数组织代码是 组合式API 写法。比如:

<script>
export default {
  setup () {
      // 用什么调用函数即可。
    // vue2 用什么去对应的属性中书写。
  }
};
</script>

举例

实现下面的需求

选项式 

<script>
export default {
  data() {
    return {
      show: true,
      count: 0,
    };
  },
  methods: {
    toggle() {
      this.show = !this.show;
    },
    increment() {
      this.count++;
    },
  },
};
</script>
<template>
  <img v-show="show" alt="Vite logo" src="/vite.svg" />
  <button @click="toggle">显示隐藏图片</button>
  <hr />
  <h2>计数器:{{ count }}</h2>
  <button @click="increment">累加</button>
</template>

组合式 

 <script>
// ref 就是一个组合式API  
import { ref } from 'vue';
export default {
  setup () {
    // 显示隐藏
    const show = ref(true)
    const toggle = () => {
      show.value = !show.value
    }
    // 计数器
    const count = ref(0)
    const increment = () => {
      count.value ++
    }
    // 将组件需要的状态、方法等返回给组件
    return { show, toggle, count, increment }
  }
};
</script>
<template>
  <img v-show="show" alt="Vue logo" src="/vite.svg" />
  <button @click="toggle">显示隐藏图片</button>
  <hr />
  <h2>计数器:{{ count }}</h2>
  <button @click="increment">累加</button>
</template>

 

总结

  • 代码更紧凑,相关业务代码在一起,写的时候不用来会跳跃着寻找。
  • 在setup中通过vue提供的函数组织代码实现功能,就是组合式API写法。
  • 组合式API有什么好处?可复用,可维护。
  • ref 是不是一个组合式API?是。

 

组合式API使用


setup 函数

说明
●setup 函数是 vue3 组合式 API 的入口函数,是 vue3 特有的选项,是组合式API的起点。
●页面需要的数据或者函数(工具函数、事件处理函数)直接定义在 setup 函数中并返回给组件。
●在页面中使用 setup 函数返回的数据或者函数。
●setup 会在原来的选项式 API 之前执行,所以就有了 vue3 中将 script 放到开头的习惯。

 

<script>
export default {
  // setup 函数
  setup() {
    console.log('setup执行了');
    // 定义数据
    const msg = 'hello vue3';
    // 定义函数
    const say = () => {
      console.log(msg);
    };
    // 将组件和函数返回给组件实例
    return { msg, say };
  },

  // 验证 setup 会在原来的选项式 API 之前执行
  beforeCreate() {
    console.log('beforeCreate执行了');
  },
};
</script>
<template>
  <div class="container">
    <h1>{{ msg }}</h1>
    <button @click="say">say</button>
  </div>
</template>
<style scoped>
.container {
  height: 300px;
  width: 600px;
}
</style>
 

 

总结

setup 函数是 vue3 的最大特点,所有 vue3 的新特性写法都是在这个函数中完成的,我们后续学习的所有响应式 API,都是在这个函数中使用。

响应式数据的定义

说明

我们说 vue 框架的核心特点就是“数据驱动视图”,即数据变化页面自动更新,开发者不用再考虑 DOM 的操作(这是目前前端框架的主要设计思想)。

在 vue2 中,我们在 data 中定义数据,在事件函数中修改数据,数据变化页面刷新。

我们顺着这个思路修改上面的例子。

<script>
export default {
  // setup 函数
  setup () {
    console.log('setup执行了')
    // 将数据修改为 let 定义。
    let msg = 'hello vue3'
    // 定义函数
    const say = () => {
      // 数据修改前
      console.log('msg 修改前', msg)
      // 修改数据
      msg = 'hello vue4'
      // 数据修改后
      console.log('msg 修改后', msg)
    }
    // 返回给组件实例使用
    return { msg , say }
  },
}
</script>
<template>
  <div class="container">
    <h2>{{msg}}</h2>
    <button  @click="say">say</button>
  </div>
</template>
<style scoped>
  .container {
    height: 300px;
    width: 600px;
  }
</style>

 

页面没有响应数据的变化,这是因为在 setup 函数中定义的数据虽然可以在页面上显示,但不是响应式的。如果想实现数据变化页面对应变化的需求,需要指定数据为响应式的。

接下来我们就来看如何在 vue3 中的 setup 函数中定义响应式数据。

方式1:ref 函数

使用 ref 函数定义响应式数据。

步骤

  • 导入 ref 函数
  • 将想作为响应式的数据作为参数传递给 ref 函数并调用
  • 定义一个变量保存 ref 函数调用后的返回值。
  • 将这个变量设置为 setup 函数的返回对象的属性。
  • 在template中直接 {{ 变量 }} 使用,在事件处理函数中通过 “变量.value = 新值” 的形式修改

<script>
// 导入ref函数
import { ref } from "vue";
  
export default {
  setup() {
    // 调用ref函数创建响应式数据
    const age = ref(18);
    const decrement = () => {
      // js中使用需要 .value 修改数据
      age.value -=1;
    };
    // 返回数据和函数给到 vue 框架
    return { age, decrement };
  },
};
</script>
<template>
  <div>
    <!-- template中使用可省略.value -->
    <h1>年龄:{{ age }}</h1>
    <button @click="age++">+1</button>
    <button @click="decrement">-1</button>
  </div>
</template>

 同理如果有多个要维护的响应式数据,再次调用 ref 函数即可。比如我们新增一个 name 属性。

使用对象作为响应式数据

<script>

// 导入ref函数

import { ref } from "vue";

export default {

  setup() {

    // 调用ref函数创建响应式数据

    const age = ref(18);

    const decrement = () => {

      // js中使用需要 .value 修改数据

      age.value -=1;

    };

    // 创建 name 响应式数据

    const name = ref('bingo');

    const changeName = () => {

      // js中使用需要 .value 修改数据

      name.value = 'rose-' + Math.random().toFixed(2)

    };

    // 创建对象响应式数据

    const obj = ref({age: 20, name: '99'})

    const changeObj = () => {

      // js中使用需要 .value 修改数据

      obj.value.name = obj.value.name+'变'

      obj.value.age = obj.value.age+1

    }

    // 返回数据和函数给到 vue 框架

    return { age, decrement, name, changeName, obj, changeObj };

  },

};

</script>

<template>

  <div>

    <div>

      <!-- template中使用可省略.value -->

      <h1>年龄:{{ age }}</h1>

      <button @click="age++">+1</button>

      <button @click="decrement">-1</button>

    </div>

    <div>

      <!-- template中使用可省略.value -->

      <h1>姓名:{{ name }}</h1>

      <button @click="changeName">改名</button>

    </div>

    <div>

      <!-- template中使用可省略.value -->

      <h1>对象姓名:{{ obj.name }},对象年龄:{{ obj.age }}</h1>

      <button @click="changeObj">改对象</button>

    </div>

  </div>

</template>

 

总结

在 js 中要通过 .value 进行数据的获取和修改,在页面中可以省略。

方式2:reactive 函数

除了上面的 ref 函数定义响应式数据外,vue3 中还提供了 reactive 函数定义响应式数据的方式。

reactive 用来定义对象类型的响应式数据,就是 reactive 函数接收一个对象作为参数,返回这个对象的响应式数据。

步骤

  • 导入 reactive 函数
  • 将你想作为响应式的对象数据作为参数传递给 reactive 函数并调用
  • 将 reactive 函数调用后的返回值作为 setup 函数的返回值传递给 vue 框架
  • 在template中直接 {{ 对象.属性 }} 使用,在事件处理函数(script)中通过“对象.属性”的形式修改

<script>
// 导入reactive函数
import { reactive } from "vue";
  
export default {
  setup() {
    // 调用ref函数创建响应式数据
    const obj = reactive({name: 'bingo', age: 18})
    const changeObj = () => {
      obj.age = obj.age + 1
      obj.name = obj.name+'变'
    }

    // 返回数据和函数到 vue 框架
    return { obj, changeObj };
  },
};
</script>
<template>
  <div>
    <!-- template中直接使用 -->
    <h1>对象姓名:{{ obj.name }},对象年龄:{{ obj.age }}</h1>
    <button @click="changeObj">改对象</button>
  </div>
</template>

 

ref 和 reactive 的选择

既然二者都可以创建响应式数据,那应给怎么选择呢?

一般来说能使用 ref 的场景就尽量使用 ref,使用 ref 基本可以满足日常的开发需求。当然如果你有多层嵌套对象数据关系时又不想使用 .value 的形式修改数据,这时可以使用 reactive 创建响应式数据。或者当你有逻辑上强相关的数据你不想分开处理,此时可以使用 reactive 处理。比如:用户名和密码这两个数据逻辑上强相关并且你想放到一起,此时可以使用 reactive 。

我们开发过程中主要使用 ref 。

setup 语法糖

说明

从上面的几个例子中,同学们应该看到 setup 函数中每次定义完响应式数据或者事件处理函数最后都要放到一个对象中返回给 vue3 框架去使用。因为开发者很容易在定义完响应式数据或者事件处理函数而忘记了在最后返回,所以 vue3 中为<script></script>标签增加了一个 setup 属性,添加了这个属性可以帮助我完成自动返回响应式数据和事件处理函数的操作。

未使用setup语法糖

<script>
// 导入reactive函数
import { reactive } from "vue";
  
export default {
  setup() {
    // 调用ref函数创建响应式数据
    const obj = reactive({name: 'bingo', age: 18})
    const changeObj = () => {
      obj.age = obj.age + 1
      obj.name = obj.name+'变'
    }
    // 返回数据和函数到 vue 框架
    return { obj, changeObj };
  },
};
</script>
<template>
  <div>
    <!-- template中直接使用 -->
    <h1>对象姓名:{{ obj.name }},对象年龄:{{ obj.age }}</h1>
    <button @click="changeObj">改对象</button>
  </div>
</template>

使用setup语法糖

 

<script setup>
// 导入reactive函数
import { reactive } from "vue";
  // 调用ref函数创建响应式数据
  const obj = reactive({name: 'bingo', age: 18})
  const changeObj = () => {
    obj.age = obj.age + 1
    obj.name = obj.name+'变'
  }
</script>

<template>
  <div>
    <!-- template中直接使用 -->
    <h1>对象姓名:{{ obj.name }},对象年龄:{{ obj.age }}</h1>
    <button @click="changeObj">改对象</button>
  </div>
</template>

 

总结

在 <script setup></script> 中定义的顶层变量都会默认返回。都是可以在页面中使用。

computed 函数

对比 vue2 中的用法来理解。vue2 中 computed 是一个对象,在这个对象中定义一个属性,属性是一个函数,函数的返回值作为这个属性的值在页面中使用。

vue3 中 computed 是一个函数,参数要求传入一个函数。传入函数的返回值将作为 computed 函数调用的返回值返回。这个返回值可以直接在页面和代码中使用。

步骤

  • 导入 computed 函数
  • 传入一个回调函数并返回一个值
  • 定义一个变量接收 computed 函数的返回值
  • 在template中直接 {{ 变量 }} 使用

<script setup>
// 导入computed函数
import { computed } from "vue";
  // 调用computed函数创建计算属性
  const count = computed(() => {
    return 100
  })
</script>

<template>
  <div>
    <!-- template中直接使用 -->
    <h1>{{count}}</h1>
  </div>
</template>

 

我们说一般计算属性的使用场景是基于已有的响应式数据进行计算,得出一个新数据。

如果依赖的数据变化,则计算属性算出的数据也发生变化,并且页面中使用到计算属性的地方也会更新。

<script setup>
// 导入computed函数
import { ref, computed } from "vue";
  // 调用computed函数创建计算属性
  const count = computed(() => {
    return 100
  })
  // 定义一个响应式数据
  const scores = ref([80, 100, 90, 70, 60]);
  // 计算80分以上的数据
  const goods = computed(() => {
    return scores.value.filter(item => item>80)
  })
</script>

<template>
  <div>
    <!-- template中直接使用 -->
    <h1>{{count}}</h1>
    <hr/>
    <h1>{{scores}}</h1>
    <button @click="scores.push(90)">改变原数组</button>
    <h1>{{goods}}</h1>
  </div>
</template>

 

总结

当你有需要基于当前组件的数据重新计算出要显示的数据时,可以使用 computed 函数。

watch 函数

watch 是一个函数,接收两个参数。第一参数是要侦听的数据源,第二个参数是一个函数会在侦听的数据源发生变化的时候执行。

一般来说开发中会有以下几种侦听数据源的需求:

  • 使用 watch 监听一个响应式数据
  • 使用 watch 监听多个响应式数据
  • 使用 watch 监听响应式对象数据中的一个属性(简单)
  • 使用 watch 监听响应式对象数据中的一个属性(复杂)
  • 使用 watch 监听,配置默认执行

使用 watch 监听一个响应式数据

<script setup>
// 引入 watch
import { ref, watch } from "vue";
  // 价格
  const price = ref(9)
  // 数量
  const quantity = ref(10)
  
 // 监听一个属性变化
  watch(price, (newValue, oldValue) => {
    console.log('价格变化之后', newValue, oldValue)
  })
 
</script>

<template>
  <div>
    <!-- template中直接使用 -->
    <h1>{{price}}</h1>
    <button @click="price+=1">改价格</button>
    <hr/>
  </div>
</template>

使用 watch 监听多个响应式数据

 

<script setup>
// 引入 watch
import { ref, watch } from "vue";
  // 价格
  const price = ref(9)
  // 数量
  const quantity = ref(10)
  
  // 监听一个属性变化
  // watch(price, (newValue, oldValue) => {
  //   console.log('价格变化之后', newValue, oldValue)
  // })
  // 监听多个属性变化
  watch([price, quantity], (newValue, oldValue) => {
    console.log('价格或者数量发生变化', newValue, oldValue)
  })
 
</script>

<template>
  <div>
    <!-- template中直接使用 -->
    <h1>{{price}}</h1>
    <button @click="price+=1">改价格</button>
    <hr/>
    <h1>{{quantity}}</h1>
    <button @click="quantity+=1">改数量</button>
    <hr/>
  </div>
</template>

 使用 watch 监听响应式对象数据中的一个属性(简单)

<script setup>
// 引入 watch
import { ref, watch } from "vue";
  // 价格
  const price = ref(9)
  // 数量
  const quantity = ref(10)
  // 侦听一个属性变化
  watch(price, (newValue, oldValue) => {
    console.log('价格变化之后', newValue, oldValue)
  })
  // 侦听多个属性变化
  watch([price, quantity], (newValue, oldValue) => {
    console.log('价格或者数量发生变化', newValue, oldValue)
  })
  const user = ref({
    name: 'bingo', 
    info: {
      gender: '男',
      age: 18,
    }
  })
  // 侦听 name 属性变化
  watch(() => user.value.name, (newValue, oldValue) => {
    console.log('name 属性变化', newValue, oldValue)
  })
 
</script>

<template>
  <div>
    <!-- template中直接使用 -->
    <h1>{{price}}</h1>
    <button @click="price+=1">改价格</button>
    <hr/>
    <h1>{{quantity}}</h1>
    <button @click="quantity+=1">改数量</button>
    <hr/>
    <h1>{{user.name}}</h1>
    <button @click="user.name+='变'">改姓名</button>
    <hr/>
  </div>
</template>

 使用 watch 监听响应式对象数据中的一个属性(复杂)

<script setup>
// 引入 watch
import { ref, watch } from "vue";
  // 价格
  const price = ref(9)
  // 数量
  const quantity = ref(10)
  // 侦听一个属性变化
  // watch(price, (newValue, oldValue) => {
  //   console.log('价格变化之后', newValue, oldValue)
  // })
  // 侦听多个属性变化
  // watch([price, quantity], (newValue, oldValue) => {
  //   console.log('价格或者数量发生变化', newValue, oldValue)
  // })
  const user = ref({
    name: 'bingo', 
    info: {
      gender: '男',
      age: 18,
    }
  })
  // 侦听 name 属性变化
  // watch(() => user.value.name, (newValue, oldValue) => {
  //   console.log('name 属性变化', newValue, oldValue)
  // })
  // 侦听 gender或age变化
  watch(() => user.value.info, (newValue, oldValue) => {
    console.log('gender或age 变化', newValue, oldValue)
  }, { deep: true })
</script>

<template>
  <div>
    <!-- template中直接使用 -->
    <h1>{{price}}</h1>
    <button @click="price+=1">改价格</button>
    <hr/>
    <h1>{{quantity}}</h1>
    <button @click="quantity+=1">改数量</button>
    <hr/>
    <h1>{{user.name}}</h1>
    <button @click="user.name+='变'">改姓名</button>
    <hr/>
    <h1>{{user.info.age}}</h1>
    <button @click="user.info.age+=1">改年龄</button>
    <hr/>
    <h1>{{user.info.gender}}</h1>
    <button @click="user.info.gender+='变'">改性别</button>
    <hr/>
  </div>
</template>

 使用 watch 监听,配置默认执行

<script setup>
// 引入 watch
import { ref, watch } from "vue";
  // 价格
  const price = ref(9)
  // 数量
  const quantity = ref(10)
  // 侦听一个属性变化
  // watch(price, (newValue, oldValue) => {
  //   console.log('价格变化之后', newValue, oldValue)
  // })
  // 侦听多个属性变化
  // watch([price, quantity], (newValue, oldValue) => {
  //   console.log('价格或者数量发生变化', newValue, oldValue)
  // })
  const user = ref({
    name: 'bingo', 
    info: {
      gender: '男',
      age: 18,
    }
  })
  // 侦听 name 属性变化
  // watch(() => user.value.name, (newValue, oldValue) => {
  //   console.log('name 属性变化', newValue, oldValue)
  // })
  // 侦听 gender或age变化
  watch(() => user.value.info, (newValue, oldValue) => {
    console.log('gender或age 变化', newValue, oldValue)
  }, { deep: true, immediate: true })
</script>

<template>
  <div>
    <!-- template中直接使用 -->
    <h1>{{price}}</h1>
    <button @click="price+=1">改价格</button>
    <hr/>
    <h1>{{quantity}}</h1>
    <button @click="quantity+=1">改数量</button>
    <hr/>
    <h1>{{user.name}}</h1>
    <button @click="user.name+='变'">改姓名</button>
    <hr/>
    <h1>{{user.info.age}}</h1>
    <button @click="user.info.age+=1">改年龄</button>
    <hr/>
    <h1>{{user.info.gender}}</h1>
    <button @click="user.info.gender+='变'">改性别</button>
    <hr/>
  </div>
</template>

 

vue3组合式API与vue2选项式API有什么区别 【代码】vue3组合式API与vue2选项式API有什么区别。 阅读详情

相关推荐

Vue3 组合式函数

:“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。这里需要提一下的概念:它只包括了可重用的逻辑 (数据获取、分页等) 而不需要自己渲染内容,视图输出通过作用域插槽全权交给了消费者组件。大部分能用无渲染组件实现的功能都可以通过组合式 API 以另一种更高效的方式实现,并且还不会带来额外组件嵌套的开销。

前端知识分享喵 2640

vue3-组合式API

vue3-组合式API

唯见青山不见君 2262

「Vue3系列」Vue3 组合式 API

通过模板引用,你可以在组件的 JavaScript 代码中引用模板中的特定元素或组件,从而能够直接操作它们或访问它们的属性和方法。组合式 API 的核心思想是将组件的逻辑分割成更小的函数(或称为“组合函数”),这些函数可以根据需要被引入和重用。函数是组合式 API 的核心,它提供了一个新的逻辑组织方式,允许你使用响应式状态、计算属性、方法、生命周期钩子等,而不必依赖于 Vue 组件的选项对象。函数返回一个对象,该对象中的属性将在模板中作为组件的响应式状态、方法或计算属性来使用。

日常笔记/总结/系列知识梳理 2027

Vue3入门

Vue3带来的新变化 性能提升 首次渲染更快 diff算法更快 内存占用更少 打包体积变小 更好的Typescript支持 Composition API (重点) 在使用vue2.x版本开发较复杂的组件时,逻辑难以复用,组合式api的出现可以解决此类问题 3. 破坏性语法更新 vue3.0对于2.0版本的大部分语法都是可以兼容的,但是也有一些破坏性的语法更新,这个大家要格外注意 实例方法$on移除 (eventBus现有实现模式不再支持 可以使用三方插件替代) 过滤器filter

weixin_49405038的博客 1170

C++ bitset总结

数据结构bitset 术语:某1位置位是置1,某一位复位是某一位清零。 文章目录数据结构bitset一、3种初始化方式二、位访问三、位操作四、 位集操作总结实战练习 一、3种初始化方式 bitset<32> tmp; //默认构造函数,默认全0。 bitset<32> tmp(-1); //从整形数构造 bitset<32> tmp("101"); //从包含1和0的字符串构造 二、位访问 bitset<32> tmp(256)

qq_43807092的博客 721

天池长期赛:二手车价格预测(422方案分享)

本次比赛是一次很好的锻炼数据挖掘能力的入门赛,从EDA-数据清洗-特征工程-模型调参-模型融合,能够完整的学习到大数据的分析和挖掘,值得历练。

weixin_46685991的博客 1万+

vue3组合式API

# 第一天

weixin_45090657的博客 1797

Windows下用Anaconda安装d2l库避坑指南(附PermissionError解决方案)

本文详细介绍了在Windows系统下使用Anaconda安装d2l库的完整指南,特别针对常见的PermissionError问题提供了多种解决方案。从环境准备到库安装,再到VSCode配置和数据路径处理,帮助读者顺利搭建深度学习环境并运行《动手学深度学习》的代码示例。

3a9bq4r8t2y的博客 225

【Vue3】如何创建Vue3项目及组合式API

以上就是今天要讲的内容,本文仅仅简单介绍了vue3的使用,而[vue3提供了大量能使我们快速便捷地创建项目的方法。

zhaochen1127的博客 3332

深度学习环境搭建以及DeepLabCut安装过程

文章目录 一、查询电脑硬件 安装GeForce驱动程序 二、环境搭建与软件安装 1.安装CUDA运算平台软件 2.安装cuDNN支持包 3.配置环境变量 三、 DeepLabCut环境配置 1.安装Anaconda 2.创建容器环境 3.激活容器环境 4.安装TensorFlow 5.验证TensorFlow是否安装成功 6...

m0_51136557的博客 3157

AD学习笔记(一)基础认识

文章目录AD学习笔记第一讲 AD基础认识一、两库两图(分别对应下图)1、PCB图(pcbdoc)2、原理图(schdoc)3、原理图库(schlib)4、PCB库(pcblib)二、封装1、DIP封装2、LQFP封装三、绘制整体流程1、建立工程(PrjPcb)2、建立两库两图并保存整个工程(五次)3、从库中提取绘制原理图4、原理图导入pcb图5、根据原理图布线6、pcb图交由工厂打板 AD学习笔记 第一讲 AD基础认识 一、两库两图(分别对应下图) PCB图(pcbdoc) 原理图(schdoc) PCB库

qq_52465473的博客 6686

深入探索Vue3组合式API

reactive 和 ref 是 Vue 3 中的两种响应式数据绑定方式,ref 适用于简单的响应式数据,而 reactive 则适用于复杂对象或数组的响应式数据。ref:用于声明 基本类型 或者单个变量的响应式数据。ref 的核心在于它包装了一个值,当这个值变化时,依赖它的视图会重新渲染。注意:ref 返回的是一个对象,其中的值通过 .value 属性访问。// 0reactive:用于声明 对象 或 数组 的响应式数据。reactive 更适合处理复杂的数据结构(对象或数组)。

weixin_74009702的博客 2611

如何优雅地进行频谱分析—— 一行代码实现绘制MATLAB频谱、功率谱图

之前的文章里讲了关于信号频谱、能量谱的相关理论和MATLAB编程实现方法: Mr.看海:信号频域分析方法的理解(频谱、能量谱、功率谱、倒频谱、小波分析) Mr.看海:频域特征值提取的MATLAB代码实现(频谱、功率谱、倒频谱) 不过对于刚刚开始进行这方面研究,或者对MATLAB不甚熟悉,抑或者不想花太多时间用在编程这件事上的同学,目前缺少一种足够便捷、高效、可靠的代码。 所以笔者想做这样一件事:编写一个函数,同学们只需要导入自己要分析的数据,并按照自己的需求设置部分选项,调用一行代码就可以实现绘制频

fengzhuqiaoqiu的博客 2万+

Vue3 -- 组合式API

组合式API 组合式api(Composition API)算是vue3对我们开发者来说非常有价值的一个api更新,我们先不关注具体语法,先对它有一个大的感知 1. composition vs options options API开发出来的vue应用如左图所示,它的特点是理解容易,因为各个选项都有固定的书写位置,比如响应式数据就写到data选择中,操作方法就写到methods配置项中等,应用大了之后,相信大家都遇到过来回上下找代码的困境 composition API开发的vue应用如右图所示

小海的博客 5956

第4章--CANoe library开发 - 诊断功能

因为专栏要做的是汽车ECU自动化测试程序,测试的是ECU的诊断和刷新,因此就需要利用CANoe的接口,开发一些方便使用的诊断报文收发函数。

j187067046的博客 1398

Codex 100个真实案例 - 用AI做在线考试系统(自动组卷+防作弊)

本案例使用 Codex 从零搭建一个功能完整的在线考试系统。涵盖题库管理(单选/多选/判断/填空)、智能随机组卷、考试倒计时、自动判分、成绩统计分析、以及多维度防作弊机制(切屏检测、禁止复制粘贴、IP限制等)。前端使用 Vue 3 + Element Plus 构建考试界面,后端使用 Node.js + Express + MySQL 提供 API 服务。全程用自然语言驱动 Codex 完成开发,最终交付一个可直接部署的在线考试平台。

yueyeguzhuo的专栏 81

Vue3选项式API和组合式API详解

对于熟悉使用Vue2的小伙伴来说,我们在Vue2项目中使用的就是组合式API。整个组件像是被一项一项配置出来的。data(){return {count:10,price:9.9,},computed:{sun:()=>{},watch:{/*这里有1000行代码………*/methods:{console.log("总价已更新为:",this.sum);

qq_41765777的博客 5661

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

深入探索Vue 3组合式API

(1)响应式核心原理// 收集依赖// 通知更新},Proxy代理:基于ES6 Proxy实现属性访问拦截依赖追踪:通过WeakMap建立目标对象->属性->依赖的映射关系批量更新:Vue的调度机制确保多次状态变更合并为单次更新(2)ref的进阶用法// DOM元素引用// 组件挂载后访问.focus()})// 模板引用<template>// 复杂类型处理user: {})// 自动解包模板引用:替代this.$refs的声明方式类型标注。

Science prince的博客 1863

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Vue 3 组合式 API

也就是组件是按照不同的选项来进行规划的,而不是按照组件的功能组成来进行规划的。版本的新增语法,该语法可以在大型组件中按照组件的各个功能对代码进行功能区域的划分,这样可以更加方便的管理并维护代码,同时也更好地体现了代码之间的逻辑关系。钩子函数的回调函数中,回调函数是一个使用箭头函数书写的格式。当单击页面中的命令按钮时,无序列表显示另外六个星座的名称。数据进行了侦听,同时使用了侦听属性的immediate 属性,即立即执行的侦听属性特性。➢ 钩子函数的参数是一个回调函数,具体的代码要书写在这个回调函数中。

lwaner的博客 1560

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Vue3为什么要使用组合式API——Vue3的组合式API和Vue2的选项式API的优缺点

使用组合式API的主要原因是为了更好的解决组件复杂性和代码重用性的问题。组合式API将组件的逻辑按照功能进行划分,将相关逻辑放在一起,使得代码更加清晰和易于维护。同时,组合式API还可以更好地利用TypeScript等静态类型检查工具,提高代码的可靠性和稳定性。组合式API还提供了一些新的特性,例如响应式API、生命周期钩子函数的重命名、setup函数等,这些新特性使得组合式API更加强大和灵活。

共勉 3656

Vue3中的API——选项式API、组合式API

和。对于熟悉Vue2的人来说,选项式api是一个很好的选择,但Vue3提供的组合式api对于代码复用效果更为突出。博主之前是用的React框架,现在由于工作原因换成了Vue,所以个人更倾向于Vue3的组合式api。现在博主将为大家详细介绍这两者的区别以及具体的操作。

weixin_73318685的博客 6533

vue3组合式API,看这篇就够了

子组件使用定义事件:你可以在子组件中定义事件名称(如),并使用emit来发送数据。父组件使用监听事件:在父组件中,通过监听子组件的事件,并定义处理函数来处理接收到的数据。上面可以看到有两种写法,关于defineEmits带不带参数解释如下通过ref,开发者可以轻松地访问和操作真实的 DOM 元素或子组件实例。这为动态更新内容、调用组件方法等提供了极大的便利,使得 Vue 的开发更加灵活和强大。ref在 Vue 中的作用确实类似于在原生 JavaScript 中使用id或class属性,然后通过。

clmm_的博客 3359

Vue3 组合式 API

Vue3 组合式 API 是一种基于函数的 API,允许开发者按逻辑关注点组织代码。它通过setup()函数作为入口,适合处理复杂组件的逻辑。研究表明,它解决了传统 Options API 中代码分散和混入(mixins)复用问题的缺陷。Vue3 组合式 API 是一种基于函数的 API,用于编写 Vue 组件的逻辑。代码组织:在传统的 Options API 中,组件逻辑被分散在多个选项(如datamethodscomputed)中,随着组件复杂度的增加,代码变得难以阅读和维护。代码复用。

likuoelie的博客 827

Vue3的选项式API组合式API对比

Vue 3 中的选项式 API(Options API)和组合式 API(Composition API)是两种构建组件的方式。它们本质上是两种不同的组织逻辑和编写代码的风格,都可以实现相同的功能,但各有优缺点和适用场景。

Lew269的博客 1607

Vue3之组合式API详解

Vue 3引入了组合式API,旨在提升组件逻辑复用性和可维护性。它允许通过setup函数以函数式方式组织组件逻辑,特点包括响应式状态、生命周期钩子和依赖注入。组合式API适用于新项目、大型项目、需复用逻辑的场景以及TypeScript用户。其优势在于更好的逻辑复用、更清晰的逻辑组织、更优的TypeScript支持和性能优化。核心API如ref、reactive用于定义响应式数据,computed定义计算属性,watch监听数据变化,还有生命周期钩子如onMounted等。

一个老Java开发的自白 1969
上一篇: VUE3自由理解
下一篇: VUE3生命周期
Circle_Key
博客等级 码龄4年 107粉丝 52原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值