前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从 jQuery 到 Vue3 的快捷通道

从 jQuery 到 Vue3 的快捷通道

作者头像
用户1174620
发布于 2022-05-09 11:41:38
发布于 2022-05-09 11:41:38
75600
代码可运行
举报
运行总次数:0
代码可运行

当初使用 jQuery 做了几个简单的项目,算是有一点点了解,现在学习Vue3,发现了一个可以快速转换思维的通道 —— 使用CDN的方式模拟 Vite 建立的项目!

CDN方式

jQuery的使用非常方便,用 script 引入 js文件即可,然后找到DOM即可开始操作。 而 Vue3 也支持直接用 script 引入的方式,然后使用插值的方式绑定数据,我们来看一下使用方法:

  • 引入 vue.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <head>
    <meta charset="UTF-8" />
    <!--加载 vue3 -->
    <script src="https://unpkg.com/vue@3.2.33/dist/vue.global.js"></script>
    <!--加载 element-plus -->
    <script src="https://unpkg.com/element-plus@2.1.9/dist/index.full.js"></script>
    <link href="https://unpkg.com/element-plus@2.1.9/dist/index.css" rel="stylesheet"/>
    <title>Vue3 CDN的简单演示</title>
  </head>

这样我们就可以在网页里面使用 Vue 了,另外我们引入了一个UI库——element-plus。

  • 绑定数据和事件

然后我们写一个 hello word:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<body>
    <div id="app">
      <button @click="count++">自增</button> <br>
      <el-button @click="count++" >自增</el-button> <br>
      {{ count }}
    </div>
    <script>
      const { ref, createApp } = Vue
      const app = {
        setup() {
          const count = ref(0)
          return {
            count
          }
        }
      }
      
      createApp(app)
        .use(ElementPlus)
        .mount('#app')
    </script>
  </body>
  • 插值 在模板里面使用双大括号即可实现数据绑定。
  • 事件 可以使用原生button,也可以使用UI库提供的button,用v-on(简写:@)添加事件。
  • 定义数据 这里采用 composition API 的方式,使用 ref,实现简单的计数功能。
  • 挂载 使用 createApp 创建一个App,然后挂载插件、UI库、路由、状态等。

本篇只做简单介绍,详细介绍请移步官网:https://staging-cn.vuejs.org/

组件化

一个项目有很多功能,显然不能把所有代码都放在一起,那么如何管理代码呢?Vue提供了组件化的方式,便于组织代码。

我们可以建立一个 count.js 文件(单文件组件),实现上面那个简单的计数功能:

  • count.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const { ref } = Vue
export default {
  name: 'count',
  template: `
     <button @click="count++">自增</button> <br>
     <el-button @click="count++" >自增</el-button> <br>
     {{ count }}
  `
  setup() {
    const count = ref(0)
    return {
      count
    }
  }
}

这样就可以建立一个单独的Vue组件,相关的代码都可以放在这里,管理起来就更容易了。

工程化项目

一般我们可以用 Vite 建立一个项目,然后安装需要的各种插件,但是这需要我们先了解 node、npm、yarn、vite等,还要先配置好环境,这些对于新手来说容易懵。

那么能不能暂时跳过这些,直接建立一个工程化的项目呢?当然是可以的!

我们可以模仿 Vite 建立的项目的文件结构,用CDN的方式实现一个项目。

为啥要用CDN的方式模拟一下呢?因为这样可以先不用了解node等前置知识点,可以比较清晰的看到 Vue 的运作方式,快速理解Vue的特点,可以作为一种过渡方式。

目录结构

可以发现和 Vite 建立的项目的结构是基本一样的,只是把.vue后缀变成了.js后缀。

加载各种插件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" href="../nfwt.ico" />
    <script src="src/script/appImport.js?v=1"></script>
    <!--加载 axios -->
    <script src="https://unpkg.com/axios@0.26.1/dist/axios.min.js"></script>
    <!--加载 vue3 -->
    <script src="https://unpkg.com/vue@3.2.33/dist/vue.global.js"></script>
    <!--加载 vue-router -->
    <script src="https://unpkg.com/vue-router@4.0.14/dist/vue-router.global.js"></script>
    <!--加载 pinia -->
    <script src="https://unpkg.com/vue-demi@0.12.5/lib/index.iife.js"></script>
    <script src="https://unpkg.com/pinia@2.0.13/dist/pinia.iife.js"></script>
    <!--加载 element-plus -->
    <script src="https://unpkg.com/element-plus@2.1.9/dist/index.full.js"></script>
    <link href="https://unpkg.com/element-plus@2.1.9/dist/index.css" rel="stylesheet"/>
  </head>
  • pinia 状态管理 pinia 需要加载两个文件,一个是pinia.js,另一个是其依赖项 vue-demi,实现兼容vue2的功能。

加载 main.js

main.js 是入口文件,需要在 index.html 使用 type="module" 的方式引入,这样main里面才可以使用“import”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <body>
    <div id="app">
      这里是CDN仿工程化开发的演示... 
    </div>
    <script type="module" src="src/main.js"></script>
  </body>

设置 main.js

然后在main里面加载根节点、路由设置、状态设置、UI库等操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ver = window.__ver || '?v=0'
const pinia = Pinia.createPinia()

Promise.all([
  import('./app.js' + ver),
  import('./router/index.js' + ver),
]).then((res) => {
  Vue.createApp(res[0].default)
    .use(res[1].default) // 挂载路由
    .use(ElementPlus) // 加载ElementPlus
    .use(pinia) // 状态管理
    .mount('#app') // 对应div
})

可以直接使用 import App from './app.js' 的方式加载,但是不好管理缓存。 所以采用了这种增加版本号的方式,以确保可以加载最新文件。

App.js

可以在 app.js 做页面布局,当然也可以实现其他功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const { ref, defineAsyncComponent } = Vue

// 加载菜单组件
const myMenu = defineAsyncComponent(() => import('./views/menu.js' + window.__ver))

export default {
  name: 'app',
  components: {
    myMenu
  },
  template: `
  <el-container>
    <el-header>
      CND的方式 模仿工程化项目
    </el-header>
    <el-container>
      <el-aside width="200px">
        <!--菜单-->
        <my-menu/>
      </el-aside>
      <el-container>
        <el-main>
          <!--路由容器 -->
          <router-view></router-view>
        </el-main>
        <el-footer>
          CND的简单演示。by Vue3、element-plus、Pinia、vue-Router
        </el-footer>
      </el-container>
    </el-container>
  </el-container>
  `,
  setup() {
    return {
    }
  }
}

这里采用异步组件的方式加载子组件,方便设置版本号,确保可以加载最新文件。

设置路由

为了更方便的加载组件,我们可以使用 vue-router 设置路由。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 定义路由

const routes = [
  {
    path: '/',
    name: 'Home',
    component: () => myImport('views/home')
  },
  {
    path: '/pinia',
    name: 'pinia',
    component: () => myImport('views/state/pinia')
  },
  {
    path: '/',
    name: 'ui',
    component: () => myImport('views/ui/ui-elp')
  },
  {
    path: '/h',
    name: 'h-test',
    component: () => myImport('views/h/h')
  },
  {
    path: '/jsx',
    name: 'jsx-test',
    component: () => myImport('views/h/jsx')
  }
]

const base = '/cdn3/'
const router = VueRouter.createRouter({
  history: VueRouter.createWebHistory(base),
  routes
})

export default router

如果组件只有js文件,那么可以直接使用 import 来加载,如果组件由js+html组成,需要使用 myImport 来加载,myImport 是我自己封装的函数,在最后介绍。

设置菜单

我们先做一个简单的菜单:

  • menu.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default {
  name: 'menu',
  template: `
    <router-link :to="{name:'Home'}">首页</router-link><br><br>
    <router-link :to="{name:'pinia'}">pinia</router-link><br><br>
    <router-link :to="{name:'h-test'}">h的演示</router-link><br><br>
    <router-link :to="{name:'jsx-test'}">jsx的演示</router-link><br><br>
  `,
  setup() {
    return {
    }
  }
}

这里先使用 router-link 做个简单的连接,也可以使用 el-menu 做菜单。

状态管理

这里采用最新的 pinia 进行状态管理,因为 Vuex 有点臃肿。

首先需要在 main.js 里面挂载pinia,见 main 的部分。 然后我们建立一个js文件,定义一个状态,再建立一个js文件作为组件。

  • count.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const { defineStore } = Pinia

const testPromie = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(100)
    }, 500)
  })
}

export const useCounterStore = defineStore('counter', {
  state: () => {
    return { count: 0, name: '' }
  },
  actions: {
    increment() {
      this.count ++
    },
    async loadData(val, state) {
      const foo = await testPromie()
      this.count += foo
      this.name = 'async 赋值:' + new Date().valueOf()
    },
    loadData2(val, state) {
      testPromie().then((val) => {
        this.count += val
        this.name = '异步赋值:' + new Date().valueOf()
      })
    }
  }
})
  • pinia.js

然后在组件里面引入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 状态
import { useCounterStore } from './count.js'

export default {
  name: 'pinia-test',
  setup() {
    const test = useCounterStore()
    return { count }
  }
}
  • pinia.html

我们可以把 template 部分拿出去,做成 html 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div>
  测试pinia的状态<br>
  {{ test }}<br>
  <el-button type="" @click="test.increment()">修改</el-button>
</div>

这样一个简单的项目结构就搭建起来了。

小结

本篇仅为过渡,并不是说正式项目要用这种方式开发,因为缺点也是很明显的。

当然也是有一些优点:

  • 可以更充分的利用CDN,缓存vue.js这类的变化频率低的 js 文件,只需要更新业务相关的代码即可。
  • 如果CDN不卡的话,加载速度可以更快。
  • 可以利用CDN的资源,缓解自己服务器的压力。
  • 项目可以分模块开发,稳定且基础的模块可以打包、发布到CDN里面使用。

源码和演示

补充

template 部分,如果用字符串的方式写,那么比较麻烦,所以可以分为 html 文件的方式来写,这样可以使用提示、补全和验证等功能。

然后做一个加载的函数 myImport :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.myImport = (url) => {
  return new Promise((resolve, reject) => {
    const ver = window.__ver || ''
    const baseUrl = window.__basrUrl || '/src/'
    // 先加载 js
    import(baseUrl + url + '.js' + ver).then((resjs) => {
      const js = resjs.default
      if (!js.template) {
        // 如果模板是空的,表示需要加载 html作为模板
        axios.get(baseUrl + url + '.html' + ver).then((resHTML) => {
          js.template = resHTML.data
          resolve(js)
        })
      } else {
        // 否则直接使用 js 注册组件
        resolve(js)
      }
    })
  })
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Python中的正则表达式
句点(.)符号匹配除了换行符\n以外的任何字符。无论字母、数字、空格(不包括\n换行符)、可打印字符、不可打印字符,使用.都可以匹配。
py3study
2020/01/03
2.6K0
Python正则表达式
正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。通过标准库中的re模块来支持正则表达式。 常见的正则表达式符号和特殊字符 表示法 描述 正则表达式示例 符号 re1|re2 匹配正则表达式re1或者re2 foo|bat . 匹配任何字符(除了\n之外) b.b ^ 匹配字符串的起始部分 ^Dear $ 匹配字符串的终止部分 /bin/*sh$ * 匹配0次或者多次前面出现的正则表达式 [A-Za-z0-9]* + 匹配1次或者多次前
用户1173509
2018/01/17
1.7K0
第一章:正则表达式
  正则表达式是由一堆字符和特殊符号组成的字符串。它可以为我们提供高级的文本搜索,匹配,替换功能。当然,正则表达式也不是python独有的一种模式,而是凌驾于语言之上的一种跨平台的通用标准。当我们学会了正则表达式之后,将会能够更加容易的处理我们的文本和数据。让我们开始正则之旅吧。
py3study
2020/01/20
1.2K0
python re详解
正则表达式的元字符有. ^ $ * ? { [ ] | ( ) .表示任意字符 []用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字符集,对于字符集中的字符可以理解成或的关系。 ^ 如果
py3study
2020/01/15
6990
Python3 正则表达式特殊符号及用法.md
正则表达式(Regular expressions 也称为 REs,或 regexes 或 regex patterns)本质上是一个微小的且高度专业化的编程语言。 它被嵌入到 Python 中并通过 re 模块提供给程序猿使用;而且Python 的正则表达式引擎是用 C 语言写的,所以效率是极高的。
全栈工程师修炼指南
2020/10/23
2.7K0
python——正则表达式(re模块)详解
在Python中需要通过正则表达式对字符串进⾏匹配的时候,可以使⽤⼀个python自带的模块,名字为re。
全栈程序员站长
2022/08/29
7480
python进阶(20) 正则表达式的超详细使用[通俗易懂]
  正则表达式(Regular Expression,在代码中常简写为regex、 regexp、RE 或re)是预先定义好的一个“规则字符率”,通过这个“规则字符串”可以匹配、查找和替换那些符合“规则”的文本。   虽然文本的查找和替換功能可通过字符串提供的方法实现,但是实现起来极为困难,而且运算效率也很低。而使用正则表达式实现这些功能会比较简单,而且效率很高,唯一的困难之处在于编写合适的正则表达式。   Python 中正则表达式应用非常广泛,如数据挖掘、数据分析、网络爬虫、输入有效性验证等,Python 也提供了利用正则表达式实现文本的匹配、查找和替换等操作的 re 模块。
全栈程序员站长
2022/09/19
3.7K0
在python中使用正则表达式
所以为了避免这个情况,墙裂推荐使用原生字符串类型(raw string)来书写正则表达式。
冰霜
2022/03/15
7560
在python中使用正则表达式
正则表达式(RegEx)官方手册/权威指南【Python】
正则表达式(称为RE,或正则,或正则表达式模式)本质上是嵌入在Python中的一种微小的、高度专业化的编程语言,可通过 re 模块获得。 使用这种小语言,你可以为要匹配的可能字符串集指定规则;此集可能包含英语句子,电子邮件地址,TeX命令或你喜欢的任何内容。 然后,您可以询问诸如“此字符串是否与模式匹配?”或“此字符串中的模式是否匹配?”等问题。 你还可以使用正则修改字符串或以各种方式将其拆分。
sunsky
2020/08/20
5.9K0
正则表达式(RegEx)官方手册/权威指南【Python】
Python正则re模块学习笔记
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
没有故事的陈师傅
2019/07/28
6250
正则表达式(python3)
正则表达式是对字符操作的一种逻辑公式,就是用事先定义好的一些特定字符以及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑(可以用来截取或替换操作)
全栈程序员站长
2021/04/16
3940
python re 正则表达式学习总结
# -*- coding: utf-8 -*- import re import os #------------------------------------- re(正则表达式)模块 -------------------------------- #----------------------------------------------------------------------------------------------------- #-----------------------
py3study
2020/01/13
1K0
Python正则表达式
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 None
忆想不到的晖
2021/04/04
8560
Python正则表达式
【Python】 "爬虫"出发前的装备之一正则表达式
如在一篇文章中查找出所有合法的电子邮箱地址,则可以先用正则表达式定义一个电子邮箱规则,然后再使用这个规则在整个字符串中查找。
一枚大果壳
2022/08/23
9130
Python 学习入门(13)—— 正则表达式
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再使用 regex 模块。
阳光岛主
2019/02/19
1.3K0
Python 学习入门(13)—— 正则表达式
Python:爬虫系列笔记(6) -- 正则化表达(推荐)
在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我们想要从返回的页面内容提取出我们想要的内容
昱良
2018/04/04
1.2K0
Python:爬虫系列笔记(6) -- 正则化表达(推荐)
Python正则表达式
如何把一个字符串的特征或规则告诉给计算机,让计算机知道你要描述的东西。被称为正则。
用户2700375
2022/06/09
6260
Python正则表达式
python 学习笔记(9)——Python 正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
my_sunshine
2020/10/15
6510
Python re正则表达式学习
一、re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词。
py3study
2020/01/09
7270
python运维开发笔记4
['mysql','-u','root','-p123','-e','show processlist']
py3study
2020/01/15
7370
相关推荐
Python中的正则表达式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档