【vue讲解:vue3介绍、setup、ref、reactive、监听属性、生命周期、toRef、setup写法】

news2024/12/28 3:23:20

1 vue3介绍

# Vue3的变化
	-vue3完全兼容vue2---》但是vue3不建议用vue2的写法
	-拥抱TypeScript
    	-之前咱们用的JavaScript---》ts完全兼容js
    - 组合式API和配置项API
    	vue2 是配置项api
        vue3 组合式api
        
        
# vue4必须要用

2 vue3项目创建和启动

# 创建vue3项目
	-vue-cli   官方不太建议用了
    -vite      目前官方推荐:新一代前端构建工具

# vue-cli创建
	-命令行中:vue create vue3_demo001
    -其他跟之前一样,只是选vue版本选3版本
    -使用pycharm打开---》配置启动--》跟之前一样
    
    
    


    

2.1vue3的项目简单解释

### main.js
import { createApp } from 'vue' # 通过 createApp创建vue实例
import App from './App.vue'  # 根组件
import router from './router' # vue-router
import store from './store' #vuex

var vue = createApp(App) # 创建vue实例
vue.use(store)#使用vuex
vue.use(router)# 使用vue-router
vue.mount('#app')# 挂在index.html中得div


### 其他写起来跟之前写vue2完全一致,vue3是兼容的

2.2 vite创建vue3

# 速度很快
	-创建项目还是运行项目
# 按需编译,不再等待整个应用编译完成


# 创建项目
	cnpm create vite vue3_demo002
    # 打开项目,安装依赖
    cnpm install 
    
    # 运行项目
    npm run dev
    # pycharm运行项目
  
# 使用vite和vue3创建项目的文件简单解释
	# main.js	
    import { createApp } from 'vue'
    import './style.css'
    import App from './App.vue'
    createApp(App).mount('#app') # 没有使用第三方插件
    
    # HelloWorld.vue   组合式api写法,跟之前不一样了
    <script setup>
    import { ref } from 'vue'
    defineProps({
      msg: String,
    })
    const count = ref(0)
    </script>
    <template>
      <h1>{{ msg }}</h1>
      <div class="card">
        <button type="button" @click="count++">count is {{ count }}</button>
      </div>
    </template>


    
    
# 后期我们可以自己引入 vuex,pina,vue-router,代码需要自己写
# 实现:创建vue2一样,自由选择一些插件
	-以后再vue3上,建议使用pinia 做状态管理
npm create vue@latest  # 常用的第三方插件,自己选即可

在这里插入图片描述

3 setup

# 1 vue3_demo001 :vue-cli创建的---》写法跟之前vue2一样
	先在这上面讲
# 2 vue3_demo002 :vite创建,但是没有状态管理器和路由 (不用它了)
# 3 vue3_demo003:vite创建,有状态管理器和路由  在这上面讲


# setup 函数,只有vue3中有
    setup为Vue3.0中一个新的配置项,值为一个函数
    setup是所有Composition API(组合API)编写的位置
    组件中所用到的:数据、方法等等,均要配置在setup中
    setup函数的返回值:返回一个对象,对象中的属性、方法, 在模板中均可以直接使用
#注意:
    尽量不要与Vue2.x配置混用
    Vue2.x配置(data、methos、computed...)中可以访问到setup中的属性、方法。
    但在setup中不能访问到Vue2.x配置(data、methos、computed...)。
    如果有重名, setup优先。
<template>
  <div class="home">
    <h1>setup函数的使用</h1>
    {{ name }}--{{ age }}
    <br>
    <button @click="add">点我年龄+1</button>
  </div>
</template>

<script>
import HelloWorld from '@/components/HelloWorld.vue'

export default {
  name: 'HomeView',
  setup() {
    // vue3多的,vue2没有,以后建议vue3的代码全都写在这里,不再写配置项方式了
    // 1 定义变量,跟正常写js一样
    let name = 'lqz'
    let age = 19
    // 2 定义一个函数,点击按钮,年龄加一的函数
    let add = () => {
      // alert('111')
      // 让年龄+1,出问题了,变量确实会变,但是页面不会变化---》vue3定义的变量,默认不是响应式的
      age++
      console.log(age)

    }
    // 3 必须要有返回值,是个对象,返回的对象,可以在 模板(template)中使用
    return {name, age, add}

  },
}
</script>

4 ref

# ref 用来做 基础变量[数字,字符串,布尔]的响应式
# reactive用来做 对象[数组,字典]的响应式
<template>
  <div class="home">
    <h1>setup函数的使用</h1>
    {{ name }}--{{ age }}
    <br>
    <button @click="add">点我年龄+1</button>
    <br>
    <button @click="handleChange('彭于晏')">点我变彭于晏</button>
  </div>
</template>

<script>

import {ref, reactive} from 'vue'

export default {
  name: 'HomeView',
  setup() {
    // vue3多的,vue2没有,以后建议vue3的代码全都写在这里,不再写配置项方式了
    // 1 定义变量,跟正常写js一样
    let name = ref('lqz')
    // let age = 19  // 没有响应式
    let age = ref(19)  // 有响应式,变成对象了
    // 2 定义一个函数,点击按钮,年龄加一的函数
    let add = () => {
      // alert('111')
      // 让年龄+1,出问题了,变量确实会变,但是页面不会变化---》vue3定义的变量,默认不是响应式的
      // age++   自增,就不能这么写了
      age.value++  //有响应式
      console.log(age.value)

    }
    let handleChange = (n) => {
      name.value = n  //有响应式

    }
    // 3 必须要有返回值,是个对象,返回的对象,可以在 模板(template)中使用
    return {name, age, add, handleChange}

  },
}
</script>

5 reactive

<template>
  <div class="home">
    <h1>setup函数的使用</h1>
    <p>用户名:{{ userInfo.name }}</p>
    <p>年龄:{{ userInfo.age }}</p>
    <p>爱好:{{ userInfo.hobby }}</p>

    <button @click="handleAdd">点我年龄+1</button>
  </div>

</template>

<script>

import {ref, reactive} from 'vue'

export default {
  name: 'HomeView',
  setup() {
    let userInfo = reactive({
      name: 'lqz',
      age: 19,
      hobby: '篮球'
    })

    let handleAdd = () => {
      userInfo.age++
      console.log(userInfo)
    }
    return {userInfo, handleAdd}
  },
}
</script>

5.1 ref和reactive总结

# ref函数
    作用: 定义一个响应式的数据
    语法: let xxx = ref(initValue)
    创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。
    JS中操作数据: xxx.value
    模板中读取数据: 不需要.value,直接:<div>{{xxx}}</div>
    # 备注:
    接收的数据可以是:基本类型、也可以是对象类型。
# reactive函数
    作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
    语法:let 代理对象= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)
    reactive定义的响应式数据是“深层次的”,对象无论多少层,都可以

6 监听属性-计算属性

6.1 计算属性

<template>
  <div class="home">
    <h1>计算属性:computed</h1>
    <p>姓:<input type="text" v-model="person.firstName"></p>
    <p>名:<input type="text" v-model="person.lastName"></p>
    <p>全名:{{ person.fullName }}</p>
    <p>全名修改:<input type="text" v-model="person.fullName"></p>
  </div>

</template>

<script>

import {ref, reactive, computed} from 'vue'

export default {
  name: 'HomeView',
  setup() {
    let person = reactive({
      firstName: '',
      lastName: ''
    })
    // 计算属性--->获取值
    // person.fullName = computed(() => {
    //   return person.firstName + person.lastName
    // })
    // 计算属性---》修改值
    person.fullName = computed({
      get() {
        return person.firstName +person.lastName
      },
      set(newValue) {
        console.log(newValue)
        person.firstName=newValue.substring(0,1)
        person.lastName=newValue.slice(1)
      }
    })
    return {person}
  },
}
</script>

6.2 监听属性

<template>
  <div class="home">
    <h1>监听属性:watch</h1>
    {{ age }} ====
    <button @click="handleClick">点我+1</button>
    <hr>
    <p>用户名:{{ userInfo.name }}</p>
    <button @click="handleChange">点我变长名字</button>
  </div>

</template>

<script>

import {ref, reactive, watch, computed} from 'vue'

export default {
  name: 'HomeView',
  setup() {
    let age = ref(0)
    let handleClick = () => {
      age.value++
    }
    // 1 监听基本类型
    watch(age, (newValue, oldValue) => {
      console.log(oldValue)
      console.log(newValue)
    })

    // 2 监听对象
    let userInfo = reactive({
      name: 'lqz',
      age: 19
    })
    let handleChange = () => {
      userInfo.name = '谢谢谢谢谢寻寻寻寻'
    }
    watch(() => userInfo.name, (newValue, oldValue) => {
      console.log('名字变了:' + userInfo.name)
    })


    // 3 同时监听多个变量变化
     watch([age,], (newValue, oldValue) => {
      console.log('age或msg变化了', newValue, oldValue)
    })

    return {age, handleClick, userInfo, handleChange}
  },
}
</script>

7 生命周期

# vue2 : 8个生命周期钩子
	
# vue3中变成
    beforeDestroy改名为 beforeUnmount
    destroyed改名为 unmounted
    
    
    Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下:
        beforeCreate===>setup()
        created=======>setup()
        beforeMount ===>onBeforeMount
        mounted=======>onMounted
        beforeUpdate===>onBeforeUpdate
        updated =======>onUpdated
        beforeUnmount ==>onBeforeUnmount
        unmounted =====>onUnmounted
<template>
  <div class="home">
    <h1>生命周期</h1>
    {{ name }}
    <br>
    <button @click="handleClick">点我变名字</button>
  </div>

</template>

<script>

import {
  ref,
  reactive,
  watch,
  computed,
  onBeforeMount,
  onMounted,
  onBeforeUpdate,
  onUpdated,
  onBeforeUnmount,
  onUnmounted
} from 'vue'
import axios from 'axios'

export default {
  name: 'HomeView',
  setup() {
    //1 这里写的代码,就是 beforeCreate,没有数据[变量没定义],没挂载
    console.log('beforeCreate')
    // 2 这里写代码,就是created,有数据,变量定义了,没挂载
    let name = ref('lqz')
    axios.get('http://127.0.0.1:8000/film/').then(res => {
      name.value = res.data.msg
    })
    // 3 onMounted
    onMounted(() => {
      console.log('挂载完了')
    })
    // 4 onUpdated
    onUpdated(() => {
      console.log('页面更新')
    })

    // 5 onUnmounted
    onUnmounted(() => {
      console.log('组件销毁')
    })
    let handleClick = () => {
      name.value = 'afdasdfasdfasdf'
    }

    return {name, handleClick}
  },

  //配置项api====》变了最后俩
  // beforeCreate() {
  // },
  // created() {
  // },
  // beforeMount() {
  // },
  // mounted() {
  // },
  // beforeUpdate() {
  // },
  // updated() {
  // },
  // beforeUnmount() {
  // },
  // unmounted() {
  // }

}
</script>

8 toRef

<template>
  <div class="home">
    <h1>toRef函数</h1>
    {{ name }}---{{ age }}---{{ hobby }}---{{ count }}
  </div>

</template>

<script>

import {
  ref,
  toRefs,
  reactive,
} from 'vue'

export default {
  name: 'HomeView',
  setup() {

    let data = reactive({
      name: 'lqz',
      age: 19,
      hobby: '篮球'
    })
    let count = ref(0)
    let xx = {...toRefs(data)}  // {name:lqz,age:19,bobby:篮球}
    console.log(xx)

    // 可以把对象解压

    return {...toRefs(data), count}   // {name:lqz,age:19,bobby:篮球,count:0}
  },


}
</script>

9 setup写法

<template>
  <h1>我是首页</h1>
  <!--  <div>{{ name }}</div>-->
  <!--  <button @click="handleChange">点我变名字</button>-->

  <!--  <button @click="load">点我加载</button>-->
  <!--  <div v-for="film in filmList">-->
  <!--    <p>{{ film.name }}</p>-->

  <!--  </div>-->

  <!--  <HelloWorld msg="lqz is handsome"></HelloWorld>-->


  <!--  <RouterLink to="/about">-->
  <!--    <button>点我跳转到about</button>-->
  <!--  </RouterLink>-->

  <!--  <button @click="handleGo">点我跳转到about</button>-->

<!--  {{ store.count }}-->
<!--  <button @click="handleAdd">点击+1</button>-->


  <hr>
  <el-button type="primary">Primary</el-button>
  <br>
  <el-switch v-model="value1"/>


</template>

<script setup lang="js">
//1  以后这里面写的,就相当于 写在setup函数中,现在不需要返回,在template都能用到
// import {ref,reactive} from 'vue'
// let name = ref('lqz')
// let handleChange = () => {
//   name.value = 'sadfasdfafs'
//   console.log(name)
// }


//2  加载电影数据
// import {ref, reactive} from 'vue'
// import axios from 'axios'
//
// let filmList = reactive([])
//
// //发送ajax
// let load = () => {
//   axios.get('http://127.0.0.1:8000/film/').then(res => {
//     filmList = res.data.results
//     console.log(filmList)
//   })
// }


// 3 注册组件
import HelloWorld from '@/components/HelloWorld.vue'


// 4 路由跳转  setup中没有this了---》想用谁,就是导入谁
// this.$router.push()  // 用不了了
// import {useRouter, useRoute} from 'vue-router'
//
// const router = useRouter()
// const route = useRoute()
//
//
// let handleGo = () => {
//   router.push('/about?name=lqz')
// }


// 5 pinia的使用
// import {useCounterStore} from '@/stores/counter'
// // 可以在组件中的任意位置访问 `store` 变量 ✨
// const store = useCounterStore()
// // console.log(store.count)
// let handleAdd = () => {
//   store.count++
// }


// 6 使用elementui
import {ref} from 'vue'

let value1 = ref(true)

</script>



作业

# 使用setup写法
	elmentui 登录 显示电影
    没登录不允许访问首页--》重定向到登录

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

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

相关文章

【Java学习】方法的引用

所属专栏&#xff1a;Java学习 &#x1f341;1. 方法引用 方法的引用&#xff1a;把已经存在的方法拿来使用&#xff0c;当作函数式接口中抽象方法的方法体 " :: "是方法引用符 方法引用时需要注意&#xff1a; 1. 需要有函数式接口 2. 被引用的方法必须存在 3. …

4款专业高效的Win10 录屏工具大揭秘!

Win10 系统里面一般都有自带的录屏工具&#xff0c;用截图工具就可以实现录屏。但是呢&#xff0c;这个工具只适合录制一些简短的小片段。如果想要更多功能的录屏&#xff0c;还是需要使用到第三方的录屏工具&#xff0c;这次&#xff0c;我就跟大家分享4款专业的录屏软件。 1、…

拟南芥中基因家族序列的提取

1.拟南芥基因组数据的下载 phytozome 是一个收录植物基因组数据的网站&#xff0c;数据整理比较规范&#xff0c;已 经提供了去除可变剪切的 cds 和 protein 序列文件。只有 gff3 文件需要 过滤处理 2. 对拟南芥的注释文件gff3文件进行ID处理&#xff0c;最终得到以下4个文件 …

深度解析:.secret勒索病毒如何加密你的数据并勒索赎金

引言&#xff1a; 在当今这个数字化、信息化的时代&#xff0c;网络安全已成为一个不容忽视的重要议题。随着互联网的普及和技术的飞速发展&#xff0c;我们的生活、工作乃至整个社会的运转都越来越依赖于各种计算机系统和网络。然而&#xff0c;这种高度依赖也为我们带来了前…

硬件面试经典 100 题(51~70 题)

51、请列举您知道的覆铜板厂家。 生益、建滔。 52、示波器铭牌一般都会标识两个参数&#xff0c;比如泰克 TDS1002B 示波器标识的 60MHz 和 1GS/s&#xff0c;请解释这两个参数的含义。 60MHz 是指示波器的带宽&#xff0c;即正常可以测量 60MHz 频率以下的信号。 1GS/s 是指示…

鲲鹏920s 32核处理器linpack性能调优

1、BIOS参数调优 BIOS选项 设置值 Power Policy Performance Stream Write Mode Allocate share LLC CPU Prefetching Configuration Enabled Custom Refresh Rate 64ms Die Interleaving Disabled NUMA Enable SSBS Support Disabled 2、benchmark参数调优 主…

vue项目将px转成其他单位,如rem、cqw,postcss-pxtorem的使用

安装插件 新建配置文件.postcssrc.js // module.exports { // "plugins": { // "postcss-pxtorem": { // rootValue: 1,//必须和rem的初始值一致 // propList: [*], // // selectorBlackList: [ // // ant…

计算函数(c语言)

1.描述 //小乐乐学会了自定义函数&#xff0c;BoBo老师给他出了个问题&#xff0c;根据以下公式计算m的值。 // //其中 max3函数为计算三个数的最大值&#xff0c;如&#xff1a; max3(1, 2, 3) 返回结果为3。 //输入描述&#xff1a; //一行&#xff0c;输入三个整数&#xff…

3的幂计算

给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 3 的幂次方需满足&#xff1a;存在整数 x 使得 n 3x。 示例 1&#xff1a; 输入&#xff1a;n 27 输出&#xff1a;tru…

SpringCloud天机学堂:学习计划与进度(四)

SpringCloud天机学堂&#xff1a;学习计划与进度&#xff08;四&#xff09; 文章目录 SpringCloud天机学堂&#xff1a;学习计划与进度&#xff08;四&#xff09;1、业务接口统计2、实现接口2.1、查询学习记录2.2、提交学习记录2.3、创建学习计划2.4、查询学习计划进度 1、业…

从零掌握keepalived合集

文章目录 keepalived简介keepalived部署keepalived基础设置主配置文件修改独立子配置文件实现实现日志分离 企业应用实例抢占式与非抢占式抢占式非抢占式 VIP单波配置消息通知脚本配置 实现IPVS高可用keepalivedlvs实现keepaliveshaproxy实现 keepalived简介 keepalived基于VR…

GAMES104:07游戏中渲染管线、后处理和其他的一切-学习笔记

文章目录 前言一&#xff0c;Ambient Occlusion环境光遮蔽1.1 Precomputed AO1.2 Screen Space Ambient Occlusion(SSAO)1.3 Horizon-based Ambient Occlusion(HBAO)1.4 Ground Truth-based Ambient Occlusion(GTAO)1.5 Rat-Tracing Ambient Occlusion 二&#xff0c;雾效2.1 D…

Java MessagePack序列化工具(适配Unity)

Java MessagePack序列化工具&#xff08;适配Unity&#xff09; 前言项目代码编写 结 前言 前后端统一用MessagePack&#xff0c;结果序列化的结果不一样&#xff0c;发现C#侧需要给每个类增加描述字段数量的Head&#xff0c;而Java却不用&#xff0c;所以在Java侧封装一下序列…

51系列LY-51S出现下载失败·的解法

1.他的下载电路是特殊设计的 一般连接1&#xff0c;2&#xff0c;另外的接口2&#xff0c;3一般不接&#xff0c;而且2&#xff0c;3的功能是用来diy自动下载电路的&#xff0c;你接上2&#xff0c;3又没独特的下载电路会一直复位

进程池详解

目录 进程池 1、什么是进程池&#xff1f; 2、实现进程池 &#xff08;1&#xff09;相关函数&#xff1a; pipe函数&#xff1a; write函数 read函数 waitpid函数 &#xff08;2&#xff09;代码实现面向过程进程池 Task.hpp processPool.cc 3、注意事项 进程池 …

坚鹏讲人才第12期:引领数字化未来—数字化人才与导师共赢之路

坚鹏讲人才第12期&#xff1a;引领数字化未来—数字化人才与导师共赢之路 ——抢占名额先机 成为坚鹏弟子 加速数字化转型 数字化浪潮汹涌而至&#xff0c;你是否感到迷茫、困惑、焦虑&#xff1f;想不想一脚油门冲进未来&#xff0c;和我一同探寻数字化人才的奥秘&#xf…

【迅为电子】RK3568驱动指南|第十七篇 串口-第202章 串口编程

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

计算机毕业设计选什么题目好?基于vue的音乐播放系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

LangGraph Studio:首款智能体(agent)IDE

0 前言 LangGraph Studio 提供了一个专门的智能体IDE&#xff0c;用于可视化、交互和调试复杂的智能体应用程序。本文来了解如何在桌面使用。 LLM为新型智能体应用程序的发展铺平了道路——随这些应用程序演进&#xff0c;开发它们所需工具也必须不断改进。今天推出的 LangG…

C++(10)类语法分析(1)

C(10)之类语法分析(1) Author: Once Day Date: 2024年8月17日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …