Vue3 – 高级语法补充

news2024/10/5 18:26:47

1 Vue中自定义指令

2 Vue内置组件Teleport

3 Vue内置组件Suspense

4 Vue中安装插件的方式

5 Vue中渲染函数的使用

6 Vue中编写jsx的语法

Vue中自定义指令

自定义指令的绑定方法有两种,一种是局部的,一种是全局的。

指令可以将部分js代码转换成指令的方式来使用,js功能的代码可以分成直接在单独页面设置使用,还可以抽取成hooks函数调用。下面这个js代码的功能是进入这个页面的时候马上获取输入框焦点。

直接在页面创建的方法:

<template>
  <div class="app">
    <!-- <input type="text" ref="inputRef"> -->
    <input type="text" v-focus>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
function useInput() {
  const inputRef = ref()

  onMounted(() => {
    inputRef.value?.focus()
  })
}

</script>

<style scoped>

</style>

抽取成hooks:放在了./hooks/useInput里面

import { ref, onMounted } from 'vue';

export default function useInput() {
  const inputRef = ref()

  onMounted(() => {
    inputRef.value?.focus()
  })

  return { inputRef }
}
<template>
  <div class="app">
    <input type="text" ref="inputRef"> 
  </div>
</template>

<script setup>
 1.方式一: 定义ref绑定到input中, 调用focus
 import useInput from "./hooks/useInput"
 const { inputRef } = useInput()
</script>

<style scoped>

</style>

使用指令的方式来实现上述的功能:

局部指令:可以用vue2的options api方法写,也可以是vue3的setup写法

在setup里面写指令一定要用v+大写字母才能是指令

<template>
  <div class="app">
    <!-- <input type="text" ref="inputRef"> -->
    <input type="text" v-focus>
  </div>
</template>

 <script>
  // 1.方式一:
  export default {
    directives: {
      focus: {
        // 生命周期的函数(自定义指令)
        mounted(el) {
          // console.log("v-focus应用的元素被挂载了", el)
          el?.focus()
        }
      }
    }
  }

</script> 

<script setup>


 2.方式二: 自定义指令(局部指令)这里一定要用v+大写字母才能是指令
 const vFocus = {
  // 生命周期的函数(自定义指令)
   mounted(el) {
     // console.log("v-focus应用的元素被挂载了", el)
     el?.focus()
   }
 }

</script>

<style scoped>

</style>

全局指令的使用是在main.js里面编写:

import { createApp } from 'vue'

// 自定义指令的方式一:
// const app = createApp(App)

// 全局指令1:
  app.directive("focus", {
    // 生命周期的函数(自定义指令)
    mounted(el) {
      // console.log("v-focus应用的元素被挂载了", el)
      el?.focus()
    }
  })
createApp(App).mount("#app")

注意:直接写在main。js里面会让main。js变得很庞大,我们可以抽取出来做成一个directive的文件夹2中写法:

focus.js代码:

export default function directiveFocus(app) {
  app.directive("focus", {
    // 生命周期的函数(自定义指令)
    mounted(el) {
      // console.log("v-focus应用的元素被挂载了", el)
      el?.focus()
    }
  })
}

main.js和index.js代码:

1、

index.js:

 

2、

index.js:

 

 

自定义指令有自己每个阶段的生命周期。

指令的修饰符

<template>
  <div class="app">
    <button @click="counter++">+1</button>

    <!-- 1.参数-修饰符-值 -->
    <!-- <h2 v-why:kobe.abc.cba="message">哈哈哈哈</h2> -->

    <!-- 2.价格拼接单位符号 -->
    <h2 v-unit> {{ 111 }} </h2>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const counter = ref(0)

const message = '你好啊, 李银河'

const vWhy = {
  mounted(el, bindings) {
    console.log(bindings)
    el.textContent = bindings.value
  }
}

</script>

<style scoped>

</style>

自定义指令小案例一

想要给数字添加对应的符号

在指令文件夹里面创建unit.js并输入

这个指令可以输入默认值,也可以直接设置用户输入的值。用户输入的时候直接在指令后面添加冒号和值。  例如:   v-unit="参数"

 在指令文件夹的入口文件添加指令

 main.js

想要使用指令的地方

 

 

自定义指令小案例二

将时间戳转换成MM-MM-DD等等的格式

<template>
  <div class="app">
    <button @click="counter++">+1</button>

    <!-- 1.参数-修饰符-值 -->
    <!-- <h2 v-why:kobe.abc.cba="message">哈哈哈哈</h2> -->

    <!-- 2.价格拼接单位符号 -->
    <h2 v-unit> {{ 111 }} </h2>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const counter = ref(0)

const message = '你好啊, 李银河'

const vWhy = {
  mounted(el, bindings) {
    console.log(bindings)
    el.textContent = bindings.value
  }
}

</script>

<style scoped>

</style>

ftime.js:

import dayjs from 'dayjs'

export default function directiveFtime(app) {
  app.directive("ftime", {
    mounted(el, bindings) {
      // 1.获取时间, 并且转化成毫秒
      let timestamp = el.textContent
      if (timestamp.length === 10) {
        timestamp = timestamp * 1000
      }

      timestamp = Number(timestamp)

      // 2.获取传入的参数
      let value = bindings.value
      if (!value) {
        value = "YYYY-MM-DD HH:mm:ss"
      }

      // 3.对时间进行格式化
      const formatTime = dayjs(timestamp).format(value)
      el.textContent = formatTime
    }
  })
}

还有一些关于管理员登录后权限的问题,普通管理员能够操作的功能少,可以通过指令来判断和限制显示的结果。

Vue内置组件Teleport

将你写的组件(也可以是普通标签)传输到其他位置,是真的挂载过去了,页面会有变化。

大概主要是用在js控制的。

<template>
  <div class="app">
    <div class="hello">
      <p class="content">
        <!-- <teleport to="body">
          <hello-world/>
        </teleport> -->
        <teleport to="#abc">
          <hello-world/>
        </teleport>
      </p>
    </div>

    <div class="content">
      <teleport to="#abc">
        <h2>哈哈哈哈哈</h2>
      </teleport>
    </div>
  </div>
</template>

<script setup>

import HelloWorld from "./HelloWorld.vue"

</script>

<style scoped>

</style>

Vue内置组件Suspense

将组件变成一个异步的,当页面加载时,页面需要去加载这个组件,在没加载出来之前可以先显示默认的提示,等加载好之后把提示清除替换成指定组件。

<template>
  <div class="app">
    <suspense>
      <template #default>
        <async-home/>
      </template>
      <template #fallback>
        <h2>Loading</h2>
      </template>
    </suspense>
  </div>
</template>

<script setup>
import { defineAsyncComponent } from 'vue';

const AsyncHome = defineAsyncComponent(() => import("./AsyncHome.vue"))

</script>

<style scoped>

</style>

Vue中安装插件的方式

作用之一是用在app里面

可以将本来分开的app传入的到函数里面转变成链式调用的写法
类似于createApp(App).use(directives).mount("#app")

import { createApp } from 'vue'
import directives from "./01_自定义指令/directives/index"
import router from "./router"


// 自定义指令的方式一:
// const app = createApp(App)
// // useDirectives(app)
// directives(app)
// app.mount('#app')

// 自定义指令的方式二:使用插件
createApp(App).use(directives).use(router).mount("#app")

Vue中渲染函数的使用

template模板会执行render函数,把标签转换成虚拟DOM。

h函数就是createVNode函数:

 

我们可以把template删除掉,改用render来自己渲染,而render函数需要返回一个createVNode,此时可以用h函数来代替,使用方法一样的。

基本使用: 

_render函数计数器实现:

<script>
  import { h } from 'vue'
  import Home from "./Home.vue"

  export default {
    data() {
      return {
        counter: 0
      }
    },

    render() {
      return h("div", { className: "app" }, [
        h("h2", null, `当前计数: ${this.counter}`),
        h("button", { onClick: this.increment }, "+1"),
        h("button", { onClick: this.decrement }, "-1"),
        h(Home)
      ])
    },
    methods: {
      increment() {
        this.counter++
      },
      decrement() {
        this.counter--
      }
    }
  }
</script>

<style scoped>

</style>

render渲染组件:

<script>
  import { h } from 'vue'
  import Home from "./Home.vue"

  export default {
   

    render() {
      return h("div", { className: "app" }, [
        h(Home)
      ])
    }
   
  }
</script>

<style scoped>

</style>

使用vue3来实现上面的功能:

// 这个template里面的render标签是setup语法糖的要求的写法。setup函数不用写这个。
<template>
  <render/>
  <h2 class="">内容</h2>
</template>

<!-- <script>
  import { h, ref } from 'vue'
  import Home from "./Home.vue"

  export default {
    setup() {
      const counter = ref(0)

      const increment = () => {
        counter.value++
      }
      const decrement = () => {
        counter.value--
      }

      return () => h("div", { className: "app" }, [
        h("h2", null, `当前计数: ${counter.value}`),
        h("button", { onClick: increment }, "+1"),
        h("button", { onClick: decrement }, "-1"),
        h(Home)
      ])
    }
  }
</script> -->

<script setup>

import { ref, h } from 'vue';
import Home from './Home.vue'

const counter = ref(0)

const increment = () => {
  counter.value++
}
const decrement = () => {
  counter.value--
}

const render = () => h("div", { className: "app" }, [
  h("h2", null, `当前计数: ${counter.value}`),
  h("button", { onClick: increment }, "+1"),
  h("button", { onClick: decrement }, "-1"),
  h(Home)
])

</script>

<style scoped>

</style>

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

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

相关文章

前端 | (四)CSS基础及CSS选择器 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;CSS基础&#x1f407;CSS简介&#x1f407;CSS编写位置⭐️行内样式⭐️内部样式⭐️外部样式 &#x1f407;样式表的优先级&#x1f407;CSS语法规范&#…

Appium 全新 2.0 全新跨平台生态,版本特性抢鲜体验!

关于Appium V2 Appium V2 beta版本在2021年发布&#xff0c;从2022年1月1号开始&#xff0c;Appium核心团队不会再维护Appium 1.x版本了&#xff0c;所有近期官方发布的平台驱动&#xff08;如Android平台的UIAutomator&#xff0c;IOS平台的XCUITest&#xff09;不再兼容Appi…

大数据分析案例-基于随机森林算法构建心力衰竭预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

云原生周刊:6 项 K8s 成本控制策略 | 2023.7.17

开源项目推荐 Base Image Finder 当使用容器扫描工具来识别已知漏洞&#xff08;CVE&#xff0c;或常见漏洞和暴露&#xff09;时&#xff0c;可能很难理解漏洞在容器中的位置&#xff0c;以及如何缓解这些漏洞。通常&#xff0c;最简单、最有效的缓解方法是更新 "基本映…

EasyPoi实战系列集合

历史文章&#xff08;文章累计480&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 导…

【黑马头条之对象存储服务MinIO】

本笔记内容为黑马头条项目的对象存储服务MinIO部分 目录 一、MinIO简介 二、MinIO特点 三、开箱使用 1、安装启动 2、管理控制台 四、快速入门 1、创建工程&#xff0c;导入pom依赖 五、封装MinIO为starter 1、创建模块heima-file-starter 2、配置类 3、封装操作mi…

VBA命令及语法列表之字典Dictionaries相关

【分享成果&#xff0c;随喜正能量】真正的修佛之人。首先&#xff0c;得明白自己的来处和归宿&#xff0c;懂得敬畏自己的生命和他人的生命&#xff0c;尽其所能释放善意。学会悲天悯人&#xff0c;渡人的同时渡己&#xff0c;始终走在止于至善的路上。真正的慈悲为怀&#xf…

有哪些方法可将PPT转成PDF?分享三个方法给大家!

将PPT&#xff08;演示文稿&#xff09;文件转换为PDF&#xff08;便携式文档格式&#xff09;是一种常见的需求&#xff0c;特别适用于共享演示文稿、打印或以静态格式保存的情况。本文将介绍三种简单易用的方法来实现PPT转PDF的操作&#xff0c;其中方法一是使用记灵在线工具…

MarkDown 生成目录的树结构

1. tree 命令的使用 Markdown没有办法直接生成目录的树结构&#xff0c;需要借助Windows下的tree命令&#xff0c;具体如下&#xff1a; 显示所有目录&#xff0c;不包含目录下的文件&#xff0c;tree 文件夹路径 显示所有目录&#xff0c;包含目录下的文件&#xff0c;tree …

命令行查看numpy版本

问题 查看numpy版本 解决方法 python -c "import numpy;print(numpy.version.version)"成功

OpenCV中reshape()函数详解-改变矩阵的通道数,对矩阵元素进行序列化

文章目录 1、函数原型2、示例3、结论&#xff1a; OpenCV中reshape()函数详解-改变矩阵的通道数&#xff0c;对矩阵元素进行序列化 在opencv中reshape函数&#xff0c;既可以改变矩阵的通道数&#xff0c;又可以对矩阵元素进行序列化 1、函数原型 Mat Mat::reshape(int cn, in…

echarts_雷达图

目录 雷达图(radar)需求[1] 复制案例[2] 色调统一[3] 配置项实现代码 雷达图(radar) 需求 [1] 复制案例 如上图&#xff0c;先复制一个最简单的雷达图 [2] 色调统一 直角系坐标都是使用xAxis/yAxis配置项&#xff0c;但是雷达图使用的是radar配置项配置坐标系。 配置项注解区…

GoFrame v2.5 版本发布,企业级 Golang 开发框架

大家好啊&#xff0c;GoFrame 框架今天发布了 v2.5.0 正式版本啦&#xff01;&#x1f44f;&#x1f44f;&#x1f44f;&#x1f44f; 本次版本主要是对已有功能组件以及开发工具上的改进工作。其中&#xff0c;开发工具新增了 gf gen ctrl 命令&#xff0c;以规范化定义、开发…

【C#】并行编程实战:使用并发集合

在上一章的并行编程实现里&#xff0c;为了保护资源&#xff0c;我们对共享资源加锁&#xff08;各种同步原语&#xff09;来进行保护&#xff0c;避免多线程同时访问&#xff08;主要是写入&#xff09;。但一般来说&#xff0c;共享资源是一个可以由多个线程读写的集合&#…

AR气象博物馆模拟体验提升青少年认知

国际气象节主要目的是唤起人们对气象工作的重视和热爱。近年来&#xff0c;极端天气频发&#xff0c;人们需要提高警惕&#xff0c;AR气象远程普利用ar技术特有的沉浸式的体感互动&#xff0c;通过模拟演练提升体验者的安全防范意识和求生技巧。 系统结合VR虚拟现实、AR增强现实…

【多模态】1、几种多模态 vision-language 任务和数据集介绍

文章目录 一、Phrase Grounding1.1 概念介绍1.2 常用数据集介绍 二、Referring Expression Comprehension&#xff08;REC&#xff09;2.1 概念介绍2.2 常用数据集介绍 三、Visual Question Answer&#xff08;VQA&#xff09;3.1 概念介绍 四、Image Caption4.1 概念介绍 现在…

MySQL-数据库读写分离(上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

(学习笔记-TCP连接建立)为什么每次建立TCP连接时,初始化的序列号都要求不一样?

主要原因有两个方面&#xff1a; 为了防止历史报文被下一个相同的四元组的连接接收(主要)为了安全性&#xff0c;防止黑客伪造相同序列号的TCP报文被对方接收 展开第一点&#xff1a; 假设每次建立连接&#xff0c;客户端恶核服务端的初始化序列号都是从0开始&#xff1a; 过程…

Mysql教程(一):Mysql数据模型和SQL语法分析

Mysql教程&#xff08;一&#xff09;&#xff1a;Mysql数据模型和SQL语法分析 1、Mysql数据模型 1.1 关系型数据库&#xff08;RDBMS&#xff09; 概念&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 特点&#xff1a; 使用表存储数…

H5活动营销系统怎么做?H5活动营销系统有哪些优势?

H5营销系统广泛用于各类线下活动场景&#xff0c;即将传统线下活动搬到线上&#xff0c;结合互动和奖励设计&#xff0c;引导用户产生转发、分享等目标行为&#xff0c;从而扩大活动影响力&#xff0c;以获得曝光和转化。因此&#xff0c;h5活动营销系统通常用于拉新促活、刺激…