前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >vue 随记(3):“新时代”的姿势

vue 随记(3):“新时代”的姿势

作者头像
一粒小麦
发布于 2020-07-21 06:57:50
发布于 2020-07-21 06:57:50
68500
代码可运行
举报
文章被收录于专栏:一Li小麦一Li小麦
运行总次数:0
代码可运行

体验vue3

对比2.x旧版本,vue3新增了什么:

•性能上:最多比vue2 快2倍•静态标记提升•proxy取代defineProperty•tree shaking:按需编译打包代码•composition api :类似hook的编码风格•支持typescript:面向未来目前的代码 98% 以上使用 TypeScript 编写。如果你还没有学习 TypeScript,请尽快学习,否则可能看不懂源码。另外有件事情说出来可能会让你非常惊讶,Vue 3 的源代码完全没有使用 class 关键字!(只在测试代码和示例代码里用到了 class 关键字)•custom renderer api:自定义渲染

1. 体验姿势

现在有三种姿势体验vue3。

1.1 脚手架工具

官方制定cli工具——升级最新版本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -g @vue/cli
vue create 01-vue3-cli
cd 01-vue3-cli
vue add vue-next
npm run serve

bingo。

1.2 webpack

vue-cli一开始还没支持的时候,vue官网整了一个webpack的项目配置,直接clone即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/vuejs/vue-next-webpack-preview.git 01-vue3-webpack
cd 01-vue3-webpack
npm install 
npm run dev
1.3 代码仓库

可在此处克隆最新的仓库代码:https://github.com/vuejs/vue-next.git,下载下来之后运行dev命令打包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 npm run dev

在example中新建一个vue3.html,直接引入vue.global.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>vue3</title>
</head>

<body>
  <div id="app"></div>
  <script src="../dist/vue.global.js"></script>
  <script>
    // ...
  </script>
</body>
</html>
1.4 vite(划重点)

这是作者尤雨溪开发的新工具,目的是以后取代webpack,原理就是利用浏览器现在已经支持es6的import,碰见import会发送一个http请求去加载文件,vite拦截这些请求,做一些预编译,就省去了webpack冗长的打包时间,从而提升开发体验。(需要node 10.15以上版本)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -g create-vite-app
create-vite-app 01-vue3-vite
cd 01-vue3-vite
npm install
npm run dev

打开http://localhost:3000,里面集成了一个vue 3小demo(没错又是计数器)

看下network,大概就知道vite的工作原理:以http请求的形式加载模块,这也是为什么它能做到复杂项目的秒开,天生的按需加载。

2. Options API 和 composition API

补白:模板fragement

其实fragement就是以后vue组件不需要一个根节点了,现在可以这么写template

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <h1>哈喽</h1>
    <div>我真棒</div>
</template>

用vue2的思路来写计数器,代码应该是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data() {
    return {
      count: 0
    }
  },
  methods:{
    click(){
      this.count += 1;
    }
  }
}
</script>

但是,在vue3的时代,变了。修改app.vue,用vue的新语法改写下计数器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <img alt="Vue logo" src="./assets/logo.png" />
    <!-- <HelloWorld msg="Hello Vue 3.0 + Vite" /> -->
    <h1>Hello Vue 3.0 + Vite</h1>
    <button @click="click">count is: {{ state.count }}</button>

    <p>
      double is <code>{{ state.double }}</code>
    </p>
  </div>
</template>

<script>
import { reactive, watchEffect, computed } from "vue";

export default {
  name: "App",
  setup() {
    // 定义响应式数据层,包括计算属性
    const state = reactive({
      count: 0,
      double: computed(() => state.count * 2),
    });

    // 数据变化的副作用
    watchEffect(() => {
      console.log(`数据变更为${state.count}`);
    });

    const click = () => {
      state.count += 1;
    };

    return {
      state,
      click,
    };
  },
};
</script>

有点像react hooks'的风格了。你每点击一次按钮,都会触发一次计数,并通过计算属性double返回视图层“双倍”信息。并且通过watchEffect,当数据变更时,在控制台打印出变更提示。

setup: 它只是一个函数,它将属性和函数返回到模板。可在此声明所有的响应式属性、计算属性、观察者和生命周期钩子,然后返回它们,以便它们可以在模板中使用。没有在setup函数返回的内容将在模板中不可用。•reactive:响应式,用的Proxy的getter和setter,取代Object.defineProperty。几乎等价于 2.x 中现有的 Vue.observable() API。这里返回的 state 是一个所有 Vue 用户都应该熟悉的响应式对象。•computed按需引入 tree-shaking生效->如果这里没有用到computed,vue3就会把它从打包中删掉。•useEffect:属性变更监听。watchEffect 应该接收一个应用预期副作用 (这里即设置 innerHTML) 的函数。它会立即执行该函数,并将该执行过程中用到的所有响应式状态的 property 作为依赖进行追踪。•这里的 state.count 会在首次执行后作为依赖被追踪。当 state.count 未来发生变更时,里面这个函数又会被重新执行。

这正是 Vue 响应式系统的精髓所在了!当你在组件中从 data() 返回一个对象,内部实质上通过调用 reactive() 使其变为响应式。而模板会被编译为渲染函数 ,因而可以使用这些响应式的 property。

实际上通过ref还可以再极简风一些:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>
import { ref, computed } from "vue";
export default {
  setup() {
    // 初始化count为0
    let count = ref(0);

    const click = () => {
      count.value += 1;
    };

    const double = computed(() => count.value * 2);

    return {
      count,
      double,
      click,
    };
  },
};
</script>

关于 reactive 和 ref 的区别,目前可以这么理解:是把一个对象变为响应式,后者是把单独的一个值变为响应式。

类似第一种写法,被称为Options API(配置式API)。而第2/3种写法,被称为Compositon API(组合式API)。你甚至可以同时混用它们——虽然作者承诺,options API现在以后都不会废弃。但是组合式api看起来更像是一种更面向未来的vue语法。

组合式API是一组低侵入式的、函数式的 API,使得我们能够更灵活地「组合」组件的逻辑。 ——https://composition-api.vuejs.org/zh/

主要的改变在于:options API中诸如data/conputed/created等,到了都需要独立从vue对象中引入。能够很好的支持按需引入(tree shaking )。

在options API中,为了将逻辑添加到Vue组件中,我们一个个填充(options)属性,如data、methods、computed等。这种方法最大的缺点是,它本身不是一个工作的JavaScript代码。你需要确切地知道模板中可以访问哪些属性以及this关键字的行为——当项目需求变得越发复杂时,你就会在method,data,computed以及watch中“反复横跳”。在底层,Vue编译器需要将此属性转换为工作代码。正因为如此,我们无法从自动建议或类型检查中获益。(如下为一段OptionsAPI代码,新增/删除一处功能要改三四个地方,非常痛苦)

作为options api的替代方案,Composition API希望将通过当前组件属性、可用的机制公开为JavaScript函数来解决这个问题。Vue核心团队将组件Composition API描述为“一套附加的、基于函数的api,允许灵活地组合组件逻辑”。使用Composition API编写的代码更易读,并且场景不复杂,这使得阅读和学习变得更容易。(如图,setup中的每个数据,监听方法都被抽离出来了)

举个例子,我可以把所有内容封装为一个useCount函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ref, computed } from "vue";

/**
* initValue 初始值
*/
const useCount = (initValue) => {
  // 初始化count为0
  let count = ref(initValue);

  const click = () => {
    count.value += 1;
  };

  const double = computed(() => count.value * 2);

  return {
    count,
    double,
    click,
  };
};

export default {
  setup() {
    const { count, double, click } = useCount(0);
    return { count, double, click };
  },
};

完成了一个最简单的逻辑复用。useCount可以放到单独的文件进行管理。你还可以给useCount增加更多的逻辑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { ref, computed, onMounted, watchEffect } from "vue";

const useCount = (initValue) => {
  // 初始化count为0
  let count = ref(initValue);

  const click = () => {
    count.value += 1;
  };

  const double = computed(() => count.value * 2);

  onMounted(() => {
    console.log("视图层渲染完毕");
  });

  watchEffect(() => {
    console.log(`count内容被变更为${count.value}`);
  });

  return {
    count,
    double,
    click,
  };
};

这也许是当前最好的逻辑复用解决方案(之前是根据mixin来做的)。

3. todoMVC实例

现在就用composition API写一个todoMVC。

3.1 原始需求

需求:写一个todoList ,实现增删查。 上面有输入框,下面有todos。可删除。

根据前面的示例可以很快写出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <h1>todoMVC</h1>

    <input type="text" v-model="state.addData" />
    <button @click="add(state.addData)">add</button>

    <ul>
      <li v-for="todo in state.list" v-bind:key="todo.id">
        <span>{{ todo.name }}</span
        >  
        <a @click="del(todo.id)" style="color:red;" href="javascript:;"
          >delete</a
        >
      </li>
    </ul>
  </div>
</template>

<script>
import { ref, reactive, computed, onMounted, watchEffect } from "vue";

export default {
  setup() {
    const state = reactive({
      list: [
        { id: 1, name: "aaa" },
        { id: 2, name: "bbb" },
        { id: 3, name: "ccc" },
      ],
      addData: "",
    });

    //  新增
    const add = (value) => {
      const newData = {
        id: new Date().getTime(),
        name: value,
      };
      state.list.push(newData);
      state.addData = "";
    };

    // 删除
    const del = (id) => {
      let _i = "";
      for (let i = 0; i < state.list.length; i++) {
        if (state.list[i].id == id) {
          _i = i;
        }
      }
      state.list.splice(_i, 1);
    };

    return { state, add, del };
  },
};
</script>
3.2 加滚动需求

清单长度过长,滚动的时候输入框吸顶 ,这是一个比较常见的操作,如果options api 我们就用有两个解决方案

1.data里加个变量判断滚动,mounted和onUnmounted修改top,2.上述功能用mixin导入,缺点是来源不清晰,容易有重名bug

现在的思路是:

通过useScroll,定义top及其更新逻辑。当top小于60时,加上固定定位的classfixed

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <div :class="{ fiexed: top > 60 }">
      <h1>todoMVC</h1>
      <input type="text" v-model="state.addData" />
      <button @click="add(state.addData)">add</button>
    </div>

    <ul>
      <li v-for="todo in state.list" v-bind:key="todo.id">
        <span>{{ todo.name }}</span
        >  
        <a @click="del(todo.id)" style="color:red;" href="javascript:;"
          >delete</a
        >
      </li>
    </ul>
  </div>
</template>

<script>
import {
  ref,
  reactive,
  computed,
  onMounted,
  onUnmounted,
  watchEffect,
} from "vue";

// 新增滚动
const useScroll = (initVal) => {
  let top = ref(initVal);

  const update = () => {
    top.value = window.scrollY;
  };

  onMounted(() => {
    window.addEventListener("scroll", update);
  });

  onUnmounted(() => {
    window.removeEventListener("scroll", update);
  });

return {
    top,
  };
};

export default {
  setup() {
    const state = reactive({
      list: [
        { id: 1, name: "aaa" },
        { id: 2, name: "bbb" },
        { id: 3, name: "ccc" },
        { id: 4, name: "aaa" },
        { id: 5, name: "bbb" },
        { id: 6, name: "ccc" },
        { id: 7, name: "aaa" },
        { id: 8, name: "bbb" },
        { id: 9, name: "ccc" },
      ],
      addData: "",
    });

    //  新增
    const add = (value) => {
      const newData = {
        id: new Date().getTime(),
        name: value,
      };
      state.list.push(newData);
      state.addData = "";
    };

    // 删除
    const del = (id) => {
      let _i = "";
      for (let i = 0; i < state.list.length; i++) {
        if (state.list[i].id == id) {
          _i = i;
        }
      }
      state.list.splice(_i, 1);
    };

    const { top } = useScroll(0);

    return { state, add, del, top };
  },
};
</script>

<style scope>
li {
  height: 200px;
}
.fiexed {
  position: fixed;
}
</style>

看到这个useScroll,完全可以从另外一个文件引入。管理起来相当轻松。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一Li小麦 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
第 001 期 聚集零散业务代码的解决方案 - Vue 3 Composition API
用 Vue 时,常出现相关业务逻辑代码散在 data, methods, watch, computed 和 mounted 等地方。这样的代码可维护性差。查找或更改这块逻辑时,都要找多个地方。
前端GoGoGo
2021/03/29
3900
通过10个实例小练习,快速入门熟练 Vue3 核心新特性
Vue3.0 发 beta 版都有一段时间了,正式版也不远了,所以真的要学习一下 Vue3.0 的语法了。
夜尽天明
2020/05/13
1.3K0
升级 Vue3 大幅提升开发运行效率
作者:louiszhai,腾讯 IEG 前端开发工程师 Vue3 性能提升了 1.3~2 倍,SSR 性能提升了 2~3 倍,升级 Vue3 正是当下。 背景 原计划 2019 年发布的 Vue3,又经过一年的再次打磨,终于于去年 9 月正式发布。随后,不少 UI 组件库都积极参与适配,去年 12 月,Element-plus(Element-ui 官方升级版)也发布了 beta 版。 由于项目中用到了 Element-ui 组件,组件库未适配的情况下,不敢贸然升级 Vue3。Element-plus
腾讯技术工程官方号
2021/04/27
2K0
再遇vue之vue3新特性
首先说明一下,vue2和vue3是Vue.js的两个主要版本。目前vue3已经更新到3.3.4的版本了
用户6297767
2023/11/21
5490
再遇vue之vue3新特性
让你30分钟快速掌握vue 3
经过了漫长的迭代,Vue 3.0终于在上2020-09-18发布了,带了翻天覆地的变化,使用了Typescript 进行了大规模的重构,带来了Composition API RFC版本,类似React Hook 一样的写Vue,可以自定义自己的hook ,让使用者更加的灵活,接下来总结一下vue 3.0 带来的部分新特性。
前端开发博客
2020/11/04
2.4K0
初探 Vue 3.0 的组装式 API(一)
Vue3 已经更新到 RC9,正式发布在即,其中让人倍加关注的重大更新:组装式 API (Composition API) 到底是什么,相比 Vue2 又有什么优势呢?
贤羽
2022/06/09
4080
推荐:非常详细的vite开发笔记(7k字)
当将当前的技术栈从Vue 2.0升级到Vue 3.0时,有许多值得考虑的理由。以下是10个升级到Vue 3.0的理由:
微芒不朽
2023/07/04
6890
推荐:非常详细的vite开发笔记(7k字)
最全系列的vue3入门教程『图文并茂』
Vue 3 是一个流行的开源JavaScript框架,用于构建用户界面和单页面应用。它带来了许多新特性和改进,包括更好的性能、更小的打包大小、更好的TypeScript支持、全新的组合式 API,以及一些新的内置组件。
linwu
2023/07/27
5.1K0
最全系列的vue3入门教程『图文并茂』
Vue开发仿京东商场app
vue3-jd-h5是一个电商H5页面前端项目,基于Vue 3.0.0 + Vant 3.0.0 实现,主要包括首页、分类页面、我的页面、购物车等,部分效果如下图。
xiangzhihong
2021/01/15
9790
@vue/composition-api速成课(通俗易懂版)
Composition API 将是 Vue 3 的核心功能,它具有许多更改和性能改进。我们也可以在 Vue 2 中通过 npm 插件@vue/composition-api 使用它。本人重点将带你了解:
前端迷
2020/09/30
2.9K0
Vue3.0 新特性以及使用变更总结(实际工作用到的)
Vue3.0 在去年9月正式发布了,也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发,这篇文章就是在使用后的一个总结, 包含Vue3新特性的使用以及一些用法上的变更。
@超人
2021/03/23
2.6K0
Vue3.0 新特性以及使用变更总结(实际工作用到的)
vue3.0 Composition API 翻译版(超长)
Composition API 一组基于功能的附加API,允许灵活地组成组件逻辑。
公众号---人生代码
2020/05/18
9K0
vue3.0 Composition API 翻译版(超长)
Vue3.0 不畏惧祖传代码的 Composition API
昨晚写这篇文章的时候,隔壁在聚餐,几位女生欢聚一堂,整个楼层充满了欢声笑语的味道,就好像早上刷牙刷一半就跑去吃了个鸡蛋。
用户1890129
2020/12/16
5560
Vue3.x相对于Vue2.x的变化
ps: 上图中,一种颜色代表一个功能,我们可以看到Options API的功能代码比较分散;Composition API则可以将同一个功能的逻辑,组织在一个函数内部,利于维护。
conanma
2021/11/03
8930
vue3.0新特性
在 vue3 的 script 中不再使用 data 和 methods ,而是使用 setup() 方法
青梅煮码
2023/02/18
3560
vue3简易入门剖析
,发音同 “veet”)是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:
张哥编程
2024/12/13
4200
学会这几个API,vue3直接上手
vue2开发过项目的,想直接上手vue3很快,几个API熟悉了就够了,其它的特性在使用vue3的过程慢慢去了解。任何在熟悉了使用之后再去研究一些API的原理,慢慢就能把vue3掌握。
wade
2022/03/28
7080
【初学者笔记】整理的一些Vue3知识点
拒绝标题党,哈哈哈,看完你就基本可以上手搞开发了,本文适合Vue初学者,或者Vue2迁移者,当然还是建议Vue3官网完全过一遍。不适合精通原理,源码的大佬们。
一尾流莺
2022/12/10
2.4K0
【初学者笔记】整理的一些Vue3知识点
【Vuejs】738- 一篇文章上手Vue3中新增的API
作者: liulongbin http://www.liulongbin.top:8085/#/?id=_3-setup 1. 初始化项目 // ① npm i -g @vue/cli // ② vu
pingan8787
2020/10/23
8060
【Vuejs】738- 一篇文章上手Vue3中新增的API
超全的Vue3文档【Vue2迁移Vue3】
链接:https://juejin.cn/post/6858558735695937544#heading-153
小丑同学
2021/03/25
2.8K0
相关推荐
第 001 期 聚集零散业务代码的解决方案 - Vue 3 Composition API
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验