三个小时学完vue3(一)

打印 上一主题 下一主题

主题 816|帖子 816|积分 2448

Vue3

之前就学过一些,不过用的比较少,基本忘完了/(ㄒoㄒ)/~~
跟着B站视频迅速回忆一下
创建一个Vue 3 应用

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7.     <script src="vue.global.js"></script>
  8. </head>
  9. <!-- vue3 学习: 创建一个vue3应用 -->
  10. <body>
  11.     <div id="app">
  12.         <!-- 插值表达式 -->
  13.         <!-- 可以获取到msg的值 -->
  14.         {{ msg }}
  15.         <h2>{{ web.title }}</h2>
  16.         <h2>{{ web.url }}</h2>
  17.     </div>
  18.    
  19.     <script>
  20.         // 去掉前面的Vue.
  21.         // 使用的一种结构赋值语法,将vue对象中的createApp和reactive的属性赋值给createApp和reactive变量
  22.         // Vue本身就是一个对象,而且createApp和reactive和Vue里面存在的属性一致,所有可以精确的解包
  23.         const {createApp,reactive} = Vue
  24.         createApp({
  25.             // setup选项, 用于设置响应式数据和方法等
  26.             setup(){
  27.                 // 定义一个应用网站
  28.                 const web = reactive({
  29.                     title: "zzz学习编程",
  30.                     url: "baidu.com"
  31.                 })
  32.                 return {
  33.                     msg: "success",
  34.                     web
  35.                 }
  36.             }
  37.         }).mount("#app") // 挂载
  38.         // Vue.createApp({
  39.         //     // setup选项, 用于设置响应式数据和方法等
  40.         //     setup(){
  41.         //         // 定义一个应用网站
  42.         //         const web = Vue.reactive({
  43.         //             title: "zzz学习编程",
  44.         //             url: "baidu.com"
  45.         //         })
  46.         //         return {
  47.         //             msg: "success",
  48.         //             web
  49.         //         }
  50.         //     }
  51.         // }).mount("#app") // 挂载
  52.     </script>
  53. </body>
  54. </html>
复制代码
Vue 3 模块化开发

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <div id="app">
  10.         {{msg}}
  11.         <h2>
  12.             {{web.title}}
  13.         </h2>
  14.         <h2>
  15.             {{web.url}}
  16.         </h2>
  17.     </div>
  18.     <!-- 添加属性:type="module" -->
  19.     <script type="module">
  20.         import {createApp, reactive} from './vue.esm-browser.js'
  21.         // 无法显示: 需要安装插件 live server(使用本地服务器进行调试)
  22.         createApp({
  23.             setup() {
  24.                 const web = reactive({
  25.                     title: "zz",
  26.                     url: "XXX.com"
  27.                 })
  28.                 return {
  29.                     msg: 'success',
  30.                     web
  31.                 }
  32.             }
  33.         }).mount("#app") // 挂载
  34.     </script>
  35. </body>
  36. </html>
复制代码
ref和reactive区别

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <!--
  10.         ref 和 reactive 的区别:
  11.         ref用于存储单个基本类型的数据,如:数字、字符串等使用
  12.         ref创建的响应式对象,需要通过,value属性来访问和修改其值
  13.         
  14.         reactive用于存储复杂数据类型,如:对象或数组等
  15.     -->
  16.     <div id="app">
  17.         {{msg}}
  18.         <h2>{{ web.title }}</h2>
  19.         <h2>{{ web.url }}</h2>
  20.         <h2>{{ number }}</h2>
  21.     </div>
  22.     <script type="module">
  23.         import {createApp, reactive, ref} from './vue.esm-browser.js'
  24.         createApp({
  25.             setup() {
  26.                 // ref 和 reactive 的区别
  27.                 // const number = ref(10)
  28.                 // ref 修改number的值(使用.value)
  29.                 // number.value = 20
  30.                 // 定义一个数组
  31.                 const number = ref([1, 2, 3])
  32.                 const web = reactive({
  33.                     title: "zz",
  34.                     url: 'xxx.com'
  35.                 })
  36.                 // reactive修改值,直接修改
  37.                 web.url = 'baidu.com'
  38.                 return {
  39.                     msg: 'ref 和 reactive 的区别',
  40.                     web,
  41.                     number
  42.                 }
  43.             }
  44.         }).mount("#app")
  45.     </script>
  46. </body>
  47. </html>
复制代码
绑定变乱v-on和按键修饰符

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <!--
  10.         绑定事件 v-on
  11.         最常用的是click事件
  12.     -->
  13.     <div id="app">
  14.         {{ msg }}
  15.         <h2>{{ web.url }}</h2>
  16.         <h2>{{ web.user }}</h2>
  17.         <!-- 定义按钮 -->
  18.         <button v-on:click="edit">修改</button><br>
  19.         <button @click="edit">修改-简写</button> <hr>
  20.         按回车键: <input type="text" @:keyup.enter="add(40, 60)"><hr>
  21.         空格:<input type="text" @keyup.space="add(20, 30)"><hr>
  22.         <!-- 使用tab 使用:@keydown -->
  23.         Tab: <input type="text" @keydown.tab="add(10, 20)"><hr>
  24.         w: <input type="text" @keyup.w="add(1, 2)"><hr>
  25.         <!-- 组合快捷键 -->
  26.         Ctrl + enter: <input type="text" @keyup.ctrl.enter="add(3, 4)"><hr>
  27.         Ctrl + A: <input type="text" @keyup.ctrl.a="add(4, 5)"><hr>
  28.     </div>
  29.     <script type="module">
  30.         import { createApp, reactive } from './vue.esm-browser.js'
  31.         createApp({
  32.             setup() {
  33.                 const web = reactive({
  34.                     url: "baidu.com",
  35.                     user: 0
  36.                 })
  37.                 // 修改网站网址
  38.                 const edit = () => {
  39.                     web.url = "www.zzzz.com"
  40.                 }
  41.                 const add = (a, b) => {
  42.                     // 假设有两个网站(a和b)
  43.                     // 统计这两个网站用户的新增数量
  44.                     web.user += a + b
  45.                 }
  46.                 return {
  47.                     msg: 'success',
  48.                     web,
  49.                     edit,
  50.                     add
  51.                 }
  52.             }
  53.         }).mount("#app")
  54.     </script>
  55. </body>
  56. </html>
复制代码
显示和隐藏 v-show

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <div id="app">
  10.         {{ web.show }} <hr>
  11.         <!-- 一段文字的显示和隐藏 -->
  12.         <p v-show="web.show">
  13.             zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
  14.         </p>
  15.         <button @click="toggle">切换显示状态</button>
  16.     </div>
  17.     <script type="module">
  18.         import { createApp, reactive } from './vue.esm-browser.js'
  19.         createApp({
  20.             setup() {
  21.                 const web = reactive({
  22.                     show: true
  23.                 })
  24.                 //
  25.                 const toggle = () => {
  26.                     web.show = !web.show
  27.                 }
  28.                
  29.                 return {
  30.                     web,
  31.                     toggle
  32.                 }
  33.             }
  34.         }).mount("#app")
  35.     </script>
  36. </body>
  37. </html>
复制代码
条件渲染 v-if



  • v-show:v-show 指令是通过修改元素的 display CSS 属性来控制元素的显示与隐藏。当 v-show 绑定的值为 true 时,元素的 display 属性会规复为本来的值(如 block、inline 等),元素会正常显示;当绑定的值为 false 时,元素的 display 属性会被设置为 none,元素在页面上不可见,但仍然会占据页面结构空间。
  • v-if 指令是根据表达式的值来决定是否将元素插入到 DOM 中。当 v-if 绑定的值为 true 时,元素会被渲染到 DOM 中;当绑定的值为 false 时,元素会从 DOM 中移除,不占据页面结构空间。
性能表现:


  • v-show:由于 v-show 只是修改元素的 CSS 属性,不会涉及 DOM 的插入和移除操作,因此在初始渲染时性能开销相对固定。当频仍切换元素的显示状态时,v-show 的性能表现较好,由于它只是简单地修改 CSS 属性,不会触发 DOM 的重新渲染。
  • v-if:在初始渲染时会根据表达式的值来决定是否渲染元素,如果条件为 false,则不会渲染该元素,因此在条件初始值为 false 时可以节省肯定的初始渲染开销。但当条件发生厘革时,v-if 会涉及 DOM 的插入和移除操作,这会带来较大的性能开销,尤其是在包罗大量子元素或复杂组件的环境下。因此,v-if 不适合频仍切换的场景。
    使用场景
  • v-show:适用于需要频仍切换元素显示状态的场景,例如实现一个下拉菜单,当用户点击菜单按钮时显示菜单,再次点击时隐藏菜单。
  • v-if:适用于在运行时条件很少改变的场景,例如根据用户的权限来决定是否显示某个功能按钮。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <div id="app">
  10.         {{ web.show }} <hr>
  11.         <!-- 一段文字的显示和隐藏 -->
  12.         <p v-show="web.show">
  13.             这是一段文字
  14.         </p>
  15.         <p v-if="web.show">
  16.             这也是一段文字
  17.         </p>
  18.         <button @click="toggle">切换显示状态</button>
  19.         <p v-if="web.user < 1000">新网站</p>
  20.         <p v-else-if="web.user >= 1000 && web.user <= 10000">优秀网站</p>
  21.         <p v-else>资深网站</p>
  22.     </div>
  23.     <script type="module">
  24.         import { createApp, reactive } from './vue.esm-browser.js'
  25.         createApp({
  26.             setup() {
  27.                 const web = reactive({
  28.                     show: true,
  29.                     user: 15000
  30.                 })
  31.                 //
  32.                 const toggle = () => {
  33.                     web.show = !web.show
  34.                 }
  35.                
  36.                 return {
  37.                     web,
  38.                     toggle
  39.                 }
  40.             }
  41.         }).mount("#app")
  42.     </script>
  43. </body>
  44. </html>
复制代码
动态属性绑定 v-bind

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7.     <style>
  8.         .textColor {
  9.             color: blue;
  10.         }
  11.     </style>
  12. </head>
  13. <body>
  14.     <div id="app">
  15.         <!-- :value -->
  16.         <h3>value="zz.com"</h3>
  17.         <input type="text" value="zz.com">
  18.         <h3>v-bind:value="zz.com"</h3>
  19.         <input type="text" v-bind:value="web.url">
  20.         <!-- 简写 -->
  21.         <h3>:value="zz.com"</h3>
  22.         <input type="text" :value="web.url">
  23.         <!-- :src -->
  24.         <h3>src="pic.jpg"</h3>
  25.         <img src="pic.jpg" style="width: 100px;">
  26.         <h3>src="pic.jpg"</h3>
  27.         <img :src="web.img" style="width: 100px;">
  28.         <!-- :class -->
  29.         <h3>class="textcolor"</h3>
  30.         <p class="textColor">zzz学习</p>
  31.         
  32.         <!-- 动态绑定class属性 -->
  33.         <h3>class="textcolor"</h3>
  34.         <p :class="{textColor: web.fontStatus}">zzz学习</p>
  35.     </div>
  36.     <script type="module">
  37.         import { createApp, reactive } from './vue.esm-browser.js'
  38.         createApp({
  39.             setup() {
  40.                 const web = reactive({
  41.                     url: 'zz.com',
  42.                     img: 'pic.jpg',
  43.                     fontStatus: false
  44.                 })
  45.                 return {
  46.                     web
  47.                 }
  48.             }
  49.         }).mount("#app")
  50.     </script>
  51. </body>
  52. </html>
复制代码
遍历数组或对象 v-for

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <!-- 遍历数组或对象 -->
  10.     <div id="app">
  11.         <ul>
  12.             <li v-for="value in data.number">
  13.                 {{ value }}
  14.             </li>
  15.         </ul>
  16.         <!-- 数组遍历索引使用 index -->
  17.         <ul>
  18.             <li v-for="(value, index) in data.number">
  19.                 index ==> {{ index }}: value ==> {{ value }}
  20.             </li>
  21.         </ul>
  22.         <!-- 对象遍历索引使用key -->
  23.         <ul>
  24.             <li v-for="(value, key) in data.user">
  25.                 key ==> {{ key }}: value ==> {{ value }}
  26.             </li>
  27.         </ul>
  28.         <ul>
  29.             <li v-for="(value, key, index) in data.user">
  30.                 index ==> {{ index }}: keye ==> {{ key }}: value ==> {{ value }}
  31.             </li>
  32.         </ul>
  33.         <!-- 关于 template 更完整的说法:Vue会编译<template>里的内容,但是不会将其作为 DOM元素 渲染到页面上 -->
  34.         <ul>
  35.             <template v-for="(value, key, index) in data.user">
  36.                 <li v-if="index === 1">
  37.                     index ==> {{ index }}: keye ==> {{ key }}: value ==> {{ value }}
  38.                 </li>
  39.             </template>
  40.         </ul>
  41.         <ul>
  42.             <!-- 动态属性value key -->
  43.             <li v-for="(value, index) in data.teacher" :title="value.name" :key="value.id">
  44.                 index ==> {{ index }}: value.id ==> {{ value.id }}: value.name ==> {{ value.name }}: value.web ==> {{ value.web }}
  45.             </li>
  46.         </ul>
  47.     </div>
  48.     <script type="module">
  49.         import { createApp, reactive } from './vue.esm-browser.js'
  50.         createApp({
  51.             setup() {
  52.                 const data = reactive({
  53.                     number: ['10', '11', '12'], // 数组
  54.                     user: {
  55.                         // 对象
  56.                         name: 'zzz',
  57.                         gender: '女'
  58.                     },
  59.                     teacher: [ // 包含两个对象的数组
  60.                         { id: 100, name: '张三', web: 'zhangsan.com' },
  61.                         { id: 101, name: '李四', web: 'lisi.com' }
  62.                     ]
  63.                 })
  64.                 return {
  65.                     data
  66.                 }
  67.             }
  68.         }).mount("#app")
  69.     </script>
  70. </body>
  71. </html>
复制代码
双向数据绑定 v-model

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <!-- 之前学的v-bind(语法糖 :)是单向绑定 -->
  10.     <!-- v-model双向绑定 -->
  11.     <div id="app">
  12.         <h3>文本框:{{ data.text }}</h3>
  13.         <h3>单选框{{ data.radio }}</h3>
  14.         <h3>复选框:{{ data.checkbox }}</h3>
  15.         <h3>记住密码:{{ data.remember }}</h3>
  16.         <h3>下拉框:{{ data.select }}</h3>
  17.         <h3>下拉框:{{ data.select.join(',') }}</h3>
  18.         <!-- 单向数据绑定:当数据发送改变时, 视图会自动更新,但用户手动更改 input 的值,数据不会更新 -->
  19.         单向数据绑定: <input type="text" :value="data.text">
  20.         <hr>
  21.         <!--
  22.             双向数据绑定:当数据发生改变时,视图会自动更新,当用户手动更改input 的值,数据也会自动更新
  23.             对于<input type="text"> v-model绑定的是 input 元素的value值
  24.         -->
  25.         双向数据绑定: <input type="text" v-model="data.text">
  26.         <hr>
  27.         <!--
  28.             单选框
  29.             对于<input type="radio"> v-model绑定的是 input 元素的选中状态
  30.          -->
  31.         <input type="radio" v-model="data.radio" value="1">写作
  32.         <input type="radio" v-model="data.radio" value="2">画画
  33.         <hr>
  34.         <!--
  35.             复选框
  36.             对于 <input type="checkbox"> v-model绑定的是 input 元素的选择状态
  37.         -->
  38.         <input type="checkbox" v-model="data.checkbox" value="a">写作
  39.         <input type="checkbox" v-model="data.checkbox" value="b">画画
  40.         <input type="checkbox" v-model="data.checkbox" value="cc">运动
  41.         <hr>
  42.         <!--
  43.             单个复选框(记住密码)
  44.         -->
  45.         <input type="checkbox" v-model="data.remember">记住密码
  46.         <hr>
  47.         <!-- 下拉框 -->
  48.         <select v-model="data.select">
  49.             <option value="">请选择</option>
  50.             <option value="A">写作</option>
  51.             <option value="B">画画</option>
  52.             <option value="C">运动</option>
  53.         </select>
  54.         <hr>
  55.         <select v-model="data.select" multiple>
  56.             <option value="">请选择</option>
  57.             <option value="A">写作</option>
  58.             <option value="B">画画</option>
  59.             <option value="C">运动</option>
  60.         </select>
  61.     </div>
  62.     <script type="module">
  63.         import { createApp, reactive } from './vue.esm-browser.js'
  64.         createApp({
  65.             setup() {
  66.                 const data = reactive({
  67.                     text: "zzz.com", // 文本框
  68.                     radio: "", // 单选
  69.                     checkbox: [], // 复选框
  70.                     remember: false, // 单个复选框- 记住密码
  71.                     // select: "" // 下拉框
  72.                     select: [] // 下拉框
  73.                 })
  74.                 return {
  75.                     data
  76.                 }
  77.             }
  78.         }).mount("#app")
  79.     </script>
  80. </body>
  81. </html>
复制代码
v-model修饰符

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <div id="app">
  10.         <!-- v-model修饰符  -->
  11.         <h3>url: {{ data.url }}</h3>
  12.         <h3>user: {{ data.user }}</h3>
  13.         实时渲染:<input type="text" v-model="data.url"><br>
  14.         失去焦点或按下回车之后在进行渲染: <input type="text" v-model.lazy="data.url"><br>
  15.         
  16.         <!-- 输入 100人, web.user 的值仍为 100 -->
  17.          <!-- 不是完全控制 -->
  18.         输入框的值转换为数字类型: <input type="text" v-model.number="data.user"><br>
  19.         <!-- trim:感觉这个在项目中还是比较常用的 -->
  20.         去掉首尾空格:<input type="text" v-model.trim="data.user">
  21.     </div>
  22.     <script type="module">
  23.         import { createApp, reactive } from './vue.esm-browser.js'
  24.         createApp({
  25.             setup() {
  26.                 const data = reactive({
  27.                     url: 'zz.com',
  28.                     user: 10
  29.                 })
  30.                 return {
  31.                     data
  32.                 }
  33.             }
  34.         }).mount("#app")
  35.     </script>
  36. </body>
  37. </html>
复制代码
渲染数据 v-text 和 v-html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <!-- 渲染数据:v-text和v-html -->
  10.     <div id="app">
  11.         <h3>{{ data.title }}</h3>
  12.         <!-- 使用v-text -->
  13.         <h3 v-text="data.title"></h3>
  14.         <!-- 使用v-html -->
  15.          <!-- 解析html标签 -->
  16.         <h3 v-html="data.url"></h3>  <!-- www.baidu.com -->
  17.         <!-- 直接输出内容 -->
  18.         <h3 v-text="data.url"></h3> <!-- <i style='color:blue;'>www.baidu.com</i> -->
  19.     </div>
  20.     <script type="module">
  21.         import { createApp, reactive } from './vue.esm-browser.js'
  22.         createApp({
  23.             setup() {
  24.                 const data = reactive({
  25.                     title: 'zzzzz',
  26.                     url: "<i style='color:blue;'>www.baidu.com</i>",
  27.                 })
  28.                 return {
  29.                     data
  30.                 }
  31.             }
  32.         }).mount("#app")
  33.     </script>
  34. </body>
  35. </html>
复制代码
计算属性 computed

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <!-- 渲染数据:v-text和v-html -->
  10.     <div id="app">
  11.         <h3>add: {{ add() }}</h3>
  12.         <h3>add: {{ add() }}</h3>
  13.         <h3>sub: {{ sub }}</h3>
  14.         <h3>sub: {{ sub }}</h3>
  15.         x: <input type="text" v-model.number="data.x">
  16.         y: <input type="text" v-model.number="data.y">
  17.     </div>
  18.     <script type="module">
  19.         import { createApp, reactive, computed } from './vue.esm-browser.js'
  20.         createApp({
  21.             setup() {
  22.                 const data = reactive({
  23.                     x: 10,
  24.                     y: 20
  25.                 })
  26.                 // 方法 - 无缓存
  27.                 let add = () => {
  28.                     console.log("add") // 打印两次
  29.                     return data.x + data.y
  30.                 }
  31.                 // 计算属性: 有缓存
  32.                 // 直接返回缓存值
  33.                 // 当计算数学以来的响应数据发生变化时才会更新
  34.                 const sub = computed(() => {
  35.                     console.log("sub")
  36.                     return data.x - data.y
  37.                 })
  38.                 return {
  39.                     data,
  40.                     add,
  41.                     sub
  42.                 }
  43.             }
  44.         }).mount("#app")
  45.     </script>
  46. </body>
  47. </html>
复制代码
侦听器 watch

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <!-- 渲染数据:v-text和v-html -->
  10.     <div id="app">
  11.         爱好
  12.         <select v-model="hobby">
  13.             <option value="">请选择</option>
  14.             <option value="1">画画</option>
  15.             <option value="2">运动</option>
  16.             <option value="3">玩游戏</option>
  17.         </select>
  18.         <hr>
  19.         年
  20.         <select v-model="data.year">
  21.             <option value="">请选择</option>
  22.             <option value="2022">2022</option>
  23.             <option value="2023">2023</option>
  24.             <option value="2024">2024</option>
  25.             <option value="2025">2025</option>
  26.         </select>
  27.         <hr>
  28.         月
  29.         <select v-model="data.month">
  30.             <option value="">请选择</option>
  31.             <option value="10">10</option>
  32.             <option value="11">11</option>
  33.             <option value="12">12</option>
  34.             <option value="13">13</option>
  35.         </select>
  36.     </div>
  37.     <script type="module">
  38.         import { createApp, ref, reactive, watch } from './vue.esm-browser.js'
  39.         createApp({
  40.             setup() {
  41.                 const hobby = ref("") // 爱好
  42.                 const data = reactive({
  43.                     year: '2022',
  44.                     month: '10'
  45.                 })
  46.                 watch(hobby, (newValue, oldValue) => {
  47.                     // console.log('newValue: ', newValue, 'oldValue:', oldValue)
  48.                     if (newValue === '1') {
  49.                         console.log('画画')
  50.                     }
  51.                 })
  52.                 /*
  53.                     watch 函数用于响应式地监听一个或多个数据源,并在数据源发生变化时执行回调函数
  54.                     接受的第一个参数可以是以下几种类型:
  55.                         响应式引用:例如 ref、computed 创建的引用。
  56.                         getter 函数:一个返回响应式值的函数。
  57.                         数组:包含多个响应式引用或 getter 函数。
  58.                 */
  59.                 // 监听data
  60.                 watch(data, (newValue, oldValue) => {
  61.                     /**
  62.                         JS中对象和数组是通过引用传递的,而不是通过值传递
  63.                         当修改对象或数组的值时,实际上修改的是对象或数组的引用,而不是创建一个新的对象或数组
  64.                         所以,如果修改了对象或数组的值,那么打印出来的结果则是修改后的值
  65.                      */
  66.                     console.log("oldValue", oldValue, "newValue", newValue)
  67.                     if (newValue.year == "2025") {
  68.                         console.log("2025")
  69.                     }
  70.                     if (newValue.month == '11') {
  71.                         console.log("11")
  72.                     }
  73.                 })
  74.                 // 监听 data 中的某个属性 year
  75.                 watch(() => data.year, (newValue, oldValue) => {
  76.                     console.log("oldValue", oldValue, "newValue", newValue)
  77.                     if (data.year == "2024") {
  78.                         console.log("2024")
  79.                     }
  80.                 })
  81.                
  82.                 return {
  83.                     hobby,
  84.                     data
  85.                 }
  86.             }
  87.         }).mount("#app")
  88.     </script>
  89. </body>
  90. </html>
复制代码
主动侦听器 watchEffect

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <!-- 渲染数据:v-text和v-html -->
  10.     <div id="app">
  11.         爱好
  12.         <select v-model="hobby">
  13.             <option value="">请选择</option>
  14.             <option value="1">画画</option>
  15.             <option value="2">运动</option>
  16.             <option value="3">玩游戏</option>
  17.         </select>
  18.         <hr>
  19.         年
  20.         <select v-model="data.year">
  21.             <option value="">请选择</option>
  22.             <option value="2022">2022</option>
  23.             <option value="2023">2023</option>
  24.             <option value="2024">2024</option>
  25.             <option value="2025">2025</option>
  26.         </select>
  27.         <hr>
  28.         月
  29.         <select v-model="data.month">
  30.             <option value="">请选择</option>
  31.             <option value="10">10</option>
  32.             <option value="11">11</option>
  33.             <option value="12">12</option>
  34.         </select>
  35.     </div>
  36.     <script type="module">
  37.         import { createApp, ref, reactive, watchEffect } from './vue.esm-browser.js'
  38.         createApp({
  39.             setup() {
  40.                 const hobby = ref("") // 爱好
  41.                 const data = reactive({
  42.                     year: '2022',
  43.                     month: '10'
  44.                 })
  45.                 // 自动监听
  46.                 // 建议手动监听
  47.                 watchEffect(() => {
  48.                     console.log("----- 监听开始")
  49.                     if (hobby.value == "1") {
  50.                         console.log('画画')
  51.                     }
  52.                     if (data.year == '2025') {
  53.                         console.log("2025")
  54.                     }
  55.                     if (data.month == '12') {
  56.                         console.log("12")
  57.                     }
  58.                     console.log("----- 监听结束")
  59.                 })
  60.                 return {
  61.                     hobby,
  62.                     data
  63.                 }
  64.             }
  65.         }).mount("#app")
  66.     </script>
  67. </body>
  68. </html>
复制代码
图片轮播案例记事本案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <div id="app">
  10.         <h3>{{ number }}</h3>
  11.         <img :src=`./imgs/${number}.jpg` style="width: 300px;"> <hr>
  12.         <button @click="prev">上一张</button>
  13.         <button @click="next">下一张</button>
  14.         <hr>
  15.         <ul>
  16.             <li v-for="value in 3">
  17.                 <a href="#" @click="jump(value)">{{ value }}</a>
  18.             </li>
  19.         </ul>
  20.     </div>
  21.     <script type="module">
  22.         import { createApp, reactive, ref } from './vue.esm-browser.js'
  23.         createApp({
  24.             setup() {
  25.                 const number = ref(1)
  26.                 const prev = () => {
  27.                     number.value--
  28.                     if (number.value == 0) {
  29.                         number.value = 3
  30.                     }
  31.                 }
  32.                 const next = () => {
  33.                     number.value++
  34.                     if (number.value == 4) {
  35.                         number.value = 1
  36.                     }
  37.                 }
  38.                 // 跳转
  39.                 const jump = (value) => {
  40.                     number.value = value
  41.                 }
  42.                 return {
  43.                     number,
  44.                     next,
  45.                     prev,
  46.                     jump
  47.                 }
  48.             }
  49.             
  50.         }).mount("#app")
  51.     </script>
  52. </body>
  53. </html>
复制代码
以上内容基本涉及了vue3的一些底子语法知识。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表