总结vue3 的一些知识点

news2025/1/11 10:00:20

vue3 支持 jsx

  1. 安装依赖

pnpm add @vitejs/plugin-vue-jsx
  1. vite.config.ts 中引用插件

import { defineConfig } from "vite"
import vue from "@vitejs/plugin-vue"
import vueJsx from "@vitejs/plugin-vue-jsx"
// https://vitejs.dev/config/

export default defineConfig({
  plugins: [
    vue(),
    vueJsx({
      transformOn: true,
      mergeProps: true,
    })
  ],
})
  1. 使用 jsx

import { defineComponent, ref } from "vue"
import "./App.scss"

const App = defineComponent({
  setup() {
    const count = ref(0)
    const onClick = () => {
      count.value++
    }

    return () => (
      <>
        <div class='page'>
          {count.value}
        </div>
        <button onClick={onClick}>增加</button>
      </>
    )
  },
})

export default App

CSS Module

任何以 .module.css 为后缀名的 CSS 文件都被认为是一个 CSS modules 文件

/* example.module.css */
.red {
  color: red;
}

import classes from './example.module.css'
document.getElementById('foo').className = classes.red

手机调试 H5

Chrome 远程调试手机页面

  1. 用 usb 连接手机和电脑
  2. 手机开启 usb 调试
  3. 手机打开要调试的页面 (ip地址 => http://192.x.x.1:端口号/)
    1. 手机浏览器输入 http://192.168.3.37:3000 访问我电脑上的网页
  4. 打开 edge://inspecticon-default.png?t=N4N7https://links.jianshu.com/go?to=edge%3A%2F%2Finspect 或者 chrome://inspect/#devicesicon-default.png?t=N4N7https://links.jianshu.com/go?to=chrome%3A%2F%2Finspect%2F%23devices 页面, 等待一会, 找到对应页面

vue-router 一个路由多个视图

应用场景: 可以对其中路由做动画

// routes.ts
export const routes: RouteRecordRaw[] = [
  { path: "/", redirect: "/welcome" },
  {
    path: "/welcome",
    component: Welcome,
    children: [
      { path: "", redirect: "/welcome/one" },
      // components 可以用对象的方式
      { path: "one", components: { main: First, footer: FirstActions } },
      { path: "two", components: { main: Second, footer: SecondActions } },
      { path: "three", components: { main: Third, footer: ThirdActions } },
      { path: "four", components: { main: Forth, footer: ForthActions } },
    ],
  }
]

// 视图使用
import { defineComponent, h, Transition, VNode } from 'vue';
import { RouteLocationNormalizedLoaded, RouterView } from 'vue-router';
import s from './Welcome.module.scss'
export const Welcome = defineComponent({
  setup: (props, context) => {
    return () => <div class={s.wrapper}>
      <header>
        <h1>xx记账</h1>
      </header>
      <main class={s.main}>
        // 使用对应的 name
        <RouterView name="main">
        </RouterView>
      </main>
      <footer>
        <RouterView name="footer" />
      </footer>
    </div>
  }
})

SvgSprite svg 雪碧图

useSwipe 滑动 hooks

import { computed, onMounted, onUnmounted, ref, Ref } from "vue"
type Point = { x: number; y: number }
export const useSwipe = (element: Ref<HTMLElement | null>) => {
  const start = ref<Point | null>(null)
  const end = ref<Point | null>(null)
  const swiping = ref(false)

  // 可以设置距离多少再移动
  const distance = computed(() => {
    if (!end.value || !start.value) return null
    return {
      x: end.value?.x - start.value?.x,
      y: end.value?.y - start.value?.y,
    }
  })
  const direction = computed(() => {
    if (!swiping) return null
    if (!distance.value) return null
    const { x, y } = distance.value
    if (Math.abs(x) > Math.abs(y)) {
      return x > 0 ? "right" : "left"
    } else {
      return y > 0 ? "down" : "up"
    }
  })

  const onStart = (e: TouchEvent) => {
    const { clientX, clientY } = e.touches[0]
    start.value = {
      x: clientX,
      y: clientY,
    }
    end.value = null
    swiping.value = true
  }

  const onMove = (e: TouchEvent) => {
    const { clientX, clientY } = e.touches[0]
    if (swiping.value) {
      end.value = {
        x: clientX,
        y: clientY,
      }
    }
  }

  const onEnd = (e: TouchEvent) => {
    swiping.value = false
    start.value = null
    end.value = null
  }

  onMounted(() => {
    if (!element.value) return null
    element.value.addEventListener("touchstart", onStart)
    element.value.addEventListener("touchmove", onMove)
    element.value.addEventListener("touchend", onEnd)
  })

  onUnmounted(() => {
    if (!element.value) return null
    element.value.removeEventListener("touchstart", onStart)
    element.value.removeEventListener("touchmove", onMove)
    element.value.removeEventListener("touchend", onEnd)
  })

  return {
    swiping,
    distance,
    direction,
  }
}

组件使用插槽(slots) 和 属性 props

// slots 使用
import { defineComponent } from "vue"
import s from "./button.module.scss"

interface ButtonProps {
  onClick: (e: MouseEvent) => void
}

export const Button = defineComponent<ButtonProps>({
  inheritAttrs: false, // 不让 vue 帮我自动继承属性
  // 插槽 context.slots
  setup: (props, context) => {
    return () => <button class={s.button}>{context.slots.default?.()}</button>
  },
})

// 具名插槽
import { defineComponent, PropType } from "vue"
import s from "NavBar.module.scss"
  
export const NavBar = defineComponent({
  setup: (props, context) => {
    const { slots } = context
    return () => (
      <div class={s.navbar}>
        <span class={s.icon_wrapper}>{slots.icon?.()}</span>
        <span class={s.title_wrapper}>{slots.default?.()}</span>
      </div>
    )
  },
})

// props 使用
import { defineComponent, PropType } from "vue"
import s from "./Icon.module.scss"

export type IconNames = "add" | "chart" | "clock" | "cloud"

export const Icon = defineComponent({
  // inheritAttrs: false,
  props: {
    name: {
      type: String as PropType<IconNames>,
      required: true,
    }
  },
  setup: (props) => {
    const { name } = props
    return () => (
      <svg class={s.icon}>
        <use xlinkHref={"#" + name}></use>
      </svg>
    )
  },
})

表情 搜索 emoji full list

  • [表情](Full Emoji List, v15.0 (unicode.org)icon-default.png?t=N4N7https://links.jianshu.com/go?to=https%3A%2F%2Funicode.org%2Femoji%2Fcharts%2Ffull-emoji-list.html)
  • '\u{1F600}'

reactive & toRaw

// 创建响应式数据
const formData = reactive({
  name: '',
  sign: ''
})
const onSubmit = (e: Event) => {
  e.preventDefault()
  console.log("proxy", formData) // proxy
  console.log("proxy", toRaw(formData)) // json
}

// v-model 使用
<input v-model={formData.name} class={[s.formItem, s.input, s.error]}></input>


 

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

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

相关文章

Golang每日一练(leetDay0075) 打家劫舍II、最短回文串

目录 213. 打家劫舍 II House Robber ii &#x1f31f;&#x1f31f; 214. 最短回文串 Shortest Palindrome &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C…

android App外包开发技术难点

在开发android App时需要注意一些技术问题&#xff0c;包括设备兼容、性能优化、安全问题及用户体验&#xff0c;这些问题往往是android App的通用问题&#xff0c;每个android App的项目都有这些问题&#xff0c;今天和大家分享一下这方面的知识&#xff0c;希望对大家有所帮助…

研发工程师玩转Kubernetes——使用环境变量给容器中程序传递参数

在《研发工程师玩转Kubernetes——构建、推送自定义镜像》中&#xff0c;Pod的IP是通过代码获取的 def get_ip():try:s socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect((8.8.8.8, 80))ip s.getsockname()[0]finally:s.close()return ip实际我们可以在清单文件中…

python 正则表达式使用总结

re库使用 re.findall import re## 存在匹配的 txt "ai aiThe rain in Spain" x re.findall("ai", txt) print(x) # 没有匹配的 txt "adafda dafasdf" x re.findall("ai", txt) print(x)s中国人adfadsfasfasdfsdaf中国万岁\n pri…

chatgpt赋能Python-python_pythonw

Python和Pythonw——SEO助您成功 Python和Pythonw是两个最广泛使用的编程语言之一。不仅是它们提供了丰富的编程功能和轻松上手的学习曲线&#xff0c;它们还具有出色的SEO优化功能&#xff0c;因为它们是自由和开源的。 Python是什么&#xff1f; Python是一种高级编程语言…

SpringCloud微服务踩坑系列:参数不全造成的空指针

服务一直报500错误&#xff0c;看了一下后台出现了空指针异常 异常如下&#xff1a; java.lang.NullPointerException: null at com.cyf.serviceOrder.service.OrderInfoService.add(OrderInfoService.java:93) ~[classes/:na] at com.cyf.serviceOrder.controller.Or…

chatgpt赋能Python-python_qq群

Python QQ群&#xff1a;学习Python的最佳社区 Python是一个非常流行的编程语言&#xff0c;因其简单易学、可读性高等特点&#xff0c;备受开发人员的青睐。为了交流学习Python&#xff0c;越来越多的人开始组建Python QQ群。本文将介绍Python QQ群的意义、特点和如何找到合适…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-10

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-10 虚拟机类加载机制类加载的过程初始化 类加载器类与类加载器双亲委派模型 虚拟机类加载机制 类加载的过程 初始化 类的初始化阶段是类加载过程的最后一个步骤&#xff0c;前几个类的加载动作里&#xff0c;除了…

Unity 新建你的第一个游戏,以及如何按WASD控制角色运动 (Unity Demo2D)

文章目录 初始化项目新建角色物体游戏资源管理试着导入资源试着管理资源试着使用资源 脚本是啥新建脚本编辑脚本行为逻辑按键检测获取按键移动位置★ 最终代码 (有基础请直接跳到这) 初始化项目 当你打开 Unity Hub&#xff0c;初始化一个 2D 项目&#xff0c;进入了 Unity 编…

人工智能TensorFlow MNIST手写数字识别——训练篇

上期我们分享了CNN的基本结构,本期我们就拿MNIST数据集来训练一下手写数字的数据库,以便我们下期能够使用训练好的模型,来进行手写数字的识别。 分享一下几个可视化网站,可以看到神经网络的识别过程。 http://scs.ryerson.ca/~aharley/vis/conv/ 1、插入MNIST数据集 #利…

Java安全和防护:如何保护Java应用程序和用户数据的安全

第一章&#xff1a;引言 在当今数字化时代&#xff0c;Java已经成为主流的编程语言之一。无论是企业级应用程序还是个人项目&#xff0c;Java应用程序都承载着大量的敏感数据和业务逻辑。然而&#xff0c;随着网络攻击日益猖獗&#xff0c;保护Java应用程序和用户数据的安全变…

Java-API简析_java.lang.Package类(基于JDK1.8)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/130806567 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

什么是 Spring?为什么学它?

前言 欢迎来到本篇文章&#xff01;在这里&#xff0c;我将带领大家快速学习 Spring 的基本概念&#xff0c;并解答两个关键问题&#xff1a;什么是 Spring&#xff0c;以及为什么学习 Spring。 废话少说&#xff0c;下面&#xff0c;我们开始吧&#xff01; Spring 官方文档…

MySQL索引详解(IT枫斗者)

MySQL索引详解 什么是索引 官方介绍索引是帮助MySQL高效获取数据的数据结构。简单来讲&#xff0c;数据库索引就像是书前面的目录&#xff0c;能加快数据库的查询速度。事实上&#xff0c;索引是一种数据结构&#xff0c;用于帮助我们在大量数据中快速定位到我们想要查找的数…

chatgpt赋能Python-python_pyyaml

Python与PYAML的SEO 介绍 在当今以数据为中心的时代&#xff0c;数据的存储、传输和处理出现了许多新的挑战。Python作为一门强大的编程语言&#xff0c;已经成为数据处理的利器。而PYAML则是Python中一款重要的yaml库。 YAML与PYAML YAML&#xff08;YAML Ain’t Markup L…

语法速通 uni-app随笔【uni-app】【微信小程序】【vue】

1、微信小程序 1.1、wx 小程序 工程目录 其中&#xff0c; pages目录/index目录【必有】&#xff1a; index.js 编写业务逻辑 【初始数据&#xff0c;生命周期函数】 index.json 编写配置 index.wxml 编写模板 【可理解为本页html】 index.wxss 【可理解为本页css】 1.2、wx…

The Development of DBMS in History--人工翻译

导言 数据库类型 &#xff0c;有时称为数据库模型或数据库族&#xff0c;是用于在数据库管理系统内组织数据的模式和结构。多年来已经开发了许多不同的数据库类型。一些主要是当前数据库的历史前辈&#xff0c;而另一些则经受住了时间的考验。在过去的几十年中&#xff0c;新的…

chatgpt赋能Python-python_plot散点图

Python Plot散点图&#xff1a;详细介绍与使用教程 Python是一种广泛使用的编程语言&#xff0c;特别适合处理数据科学任务。Python有大量的用于数据可视化的库&#xff0c;其中matplotlib是最重要的之一。在本文中&#xff0c;我们将探讨matplotlib中的散点图plot&#xff0c…

[ 云计算 Azure ] Chapter 07 | Azure 网络服务中的虚拟网络 VNet、网关、负载均衡器 Load Balancer

本系列已经更新文章列表&#xff08;已更新&#xff09;&#xff1a; [ Azure 云计算从业者 ] Chapter 03 | 描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx[ Azure 云计算从业者 ] Chapter 04 | Azure核心体系结构组件之数据中心、区域与区域对、可用区…

什么是智能合约存储布局?

本指南将解释智能合约中存储的数据。合约存储布局是指控制合约存储变量在长期内存中排布的规则。 读者先决条件知识 以下一般先决条件有助于理解本文&#xff1a; 熟悉面向对象的语言 位和字节 十六进制 智能合约 以太坊虚拟机&#xff08;EVM&#xff09; 哈希 无符号整数 静态…