一、安装

将 Vue.js 添加到项目中主要有四种方式:

  1. 在页面上以 CDN 包的方式倒入
  2. 下载 JavaScript 文件并自行托管
  3. 使用 npm 安装
  4. 使用官方 CLI 来构建项目

1. CDN

对于制作原型或学习,可以像下面这样使用最新版

  1. <script src="https://unpkg.com/vue@next"></script>

对于生产环境,一定好指定一个明确的版本号

2. 下载并自托管

使用方法和 CDN 类型,就是把文件下载下来放在自己的服务器上使用

  • 这些文件可以在 unpkgjsDelivr 这些 CDN 上浏览和下载

3. npm

在用 Vue 构建大型应用时推荐使用 npm 安装,npm 能和好地和诸如 webpack、rollup 模块打包器配合使用

  1. yarn add vue@next
  2. # 或
  3. npm install vue@next

Vue 还提供了编写单文件组件的配套工具,如果想使用但文件组件,则还需要安装 @vue/compiler-sfc

  1. yarn add -D @vue/compiler-sfc
  2. # 或
  3. npm install -D @vue/compiler-sfc

4. 命令行工具(CLI)

  1. yarn global add @vue/cli
  2. # 或
  3. npm install -g @vue/cli

然后在 Vue 项目中运行

  1. vue upgrade --next

5. Vite

Vite 是一个 web 开发构建工具,可以运行以下命令构建 Vue 项目

  1. yarn create vite <project-name> --template vue
  2. cd <project-name>
  3. yarn
  4. yarn dev

二、介绍

1. 声明式渲染

  1. <div id="counter">
  2. Counter: {{ counter }}
  3. </div>
  1. const Counter = {
  2. data() {
  3. return {
  4. counter: 0
  5. }
  6. },
  7. mounted() {
  8. setInterval(() => {
  9. this.counter++
  10. }, 1000)
  11. }
  12. }
  13. Vue.createApp(Counter).mount('#counter')

除了文本差值,还可以像这样绑定元素

  1. <div id="bind-attribute">
  2. <span v-bind:title="message">
  3. 鼠标悬停几秒钟查看此处动态绑定的提示信息!
  4. </span>
  5. </div>
  1. const AttributeBinding = {
  2. data() {
  3. return {
  4. message: 'You loaded this page on ' + new Date().toLocaleString()
  5. }
  6. }
  7. }
  8. Vue.createApp(AttributeBinding).mount('#bind-attribute')

2. 处理用户输入

  1. <div id="event-handling">
  2. <p>{{ message }}</p>
  3. <button v-on:click="reverseMessage">反转 Message</button>
  4. </div>
  1. const EventHandling = {
  2. data() {
  3. return {
  4. message: 'Hello Vue.js!'
  5. }
  6. },
  7. methods: {
  8. reverseMessage() {
  9. this.message = this.message
  10. .split('')
  11. .reverse()
  12. .join('')
  13. }
  14. }
  15. }
  16. Vue.createApp(EventHandling).mount('#event-handling')

Vue 还提供了 v-model指定,可以实现表单输入和应用状态之间的双向绑定

  1. <div id="two-way-binding">
  2. <p>{{ message }}</p>
  3. <input v-model="message" />
  4. </div>
  1. const TwoWayBinding = {
  2. data() {
  3. return {
  4. message: 'Hello Vue!'
  5. }
  6. }
  7. }
  8. Vue.createApp(TwoWayBinding).mount('#two-way-binding')

3. 条件与循环

条件

  1. <div id="conditional-rendering">
  2. <span v-if="seen">现在你看到我了</span>
  3. </div>
  1. const ConditionalRendering = {
  2. data() {
  3. return {
  4. seen: true
  5. }
  6. }
  7. }
  8. Vue.createApp(ConditionalRendering).mount('#conditional-rendering')

循环

  1. <div id="list-rendering">
  2. <ol>
  3. <li v-for="todo in todos">
  4. {{ todo.text }}
  5. </li>
  6. </ol>
  7. </div>
  1. const ListRendering = {
  2. data() {
  3. return {
  4. todos: [
  5. { text: 'Learn JavaScript' },
  6. { text: 'Learn Vue' },
  7. { text: 'Build something awesome' }
  8. ]
  9. }
  10. }
  11. }
  12. Vue.createApp(ListRendering).mount('#list-rendering')

4. 组件化应用构建

image.png

  1. <div id="todo-list-app">
  2. <ol>
  3. <!--
  4. 现在我们为每个 todo-item 提供 todo 对象
  5. todo 对象是变量,即其内容可以是动态的。
  6. 我们也需要为每个组件提供一个“key”,稍后再
  7. 作详细解释。
  8. -->
  9. <todo-item
  10. v-for="item in groceryList"
  11. v-bind:todo="item"
  12. v-bind:key="item.id"
  13. ></todo-item>
  14. </ol>
  15. </div>
  1. const TodoItem = {
  2. props: ['todo'],
  3. template: `<li>{{ todo.text }}</li>`
  4. }
  5. const TodoList = {
  6. data() {
  7. return {
  8. groceryList: [
  9. { id: 0, text: 'Vegetables' },
  10. { id: 1, text: 'Cheese' },
  11. { id: 2, text: 'Whatever else humans are supposed to eat' }
  12. ]
  13. }
  14. },
  15. components: {
  16. TodoItem
  17. }
  18. }
  19. const app = Vue.createApp(TodoList)
  20. app.mount('#todo-list-app')
  • 发现一个细节:javaScript 中组件是开头大写,中间驼峰式,html 中组件变成小写了

三、应用 & 组件实例

1. 创建一个应用实例

  1. const app = Vue.createApp({})
  2. app.component('SearchInput', SearchInputComponent)
  3. app.directive('focus', FocusDirective)
  4. app.use(LocalePlugin)

也可以链式

  1. Vue.createApp({})
  2. .component('SearchInput', SearchInputComponent)
  3. .directive('focus', FocusDirective)
  4. .use(LocalePlugin)

2. 根组件

传递给 createApp 的选项用于配置根组件。当我们挂载应用时,该组件被用作渲染的起点。

  1. const RootComponent = {
  2. /* 选项 */
  3. }
  4. const app = Vue.createApp(RootComponent)
  5. const vm = app.mount('#app')
  • 与大多数应用方法不同的是,mount不返回应用本身。相反,它返回的是根组件实例。

一个 todo 应用组件树可能是这样的:

Root Component └─ TodoList ├─ TodoItem │ ├─ DeleteTodoButton │ └─ EditTodoButton └─ TodoListFooter ├─ ClearTodosButton └─ TodoListStatistics

3. 组件实例 property

  1. const app = Vue.createApp({
  2. data() {
  3. return { count: 4 }
  4. }
  5. })
  6. const vm = app.mount('#app')
  7. console.log(vm.count) // => 4

4、生命周期钩子

每个组件在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会

比如 created 钩子

  1. Vue.createApp({
  2. data() {
  3. return { count: 1}
  4. },
  5. created() {
  6. // `this` 指向 vm 实例
  7. console.log('count is: ' + this.count) // => "count is: 1"
  8. }
  9. })
  • 还有其他的钩子,如果 mounted、updated 和 unnmounted
  • 然后不要在选项 property 或 回调上使用箭头函数

5. 生命周期图示

image.png

四、模板语法

1. 插值

文本

  1. <span>Message: {{ msg }}</span>
  1. <span v-once>这个将不会改变: {{ msg }}</span>
  • 使用 “Mustache”(双大括号)语法
  • 也可以 使用 v-once 指令,执行一次性地差值

2. 原始 HTML

  1. <p>Using mustaches: {{ rawHtml }}</p>
  2. <p>Using v-html directive: <span v-html="rawHtml"></span></p>
  • 使用 v-html指令
  • 在你的站点上动态渲染任意的 HTML 是非常危险的,因为它很容易导致 XSS 攻击

3. Attribute

  1. <div v-bind:id="dynamicId"></div>
  • 使用 v-bind 指令
  • 如果绑定的值是 nullundefined,则该 attribute 不会包含在渲染的元素上

    1. <button v-bind:disabled="isButtonDisabled">按钮</button>
  • 对于布尔 attribute (它们只要存在就意味着值为 true),v-bind 工作起来略有不同

  • 如果该值是一个空字符串,它也会被包含在内,与<button disabled="">保持一致
  • 对于其他 falsy 的值,该 attribute 将被省略

4. 使用 JavaScript 表达式

  1. {{ number + 1 }}
  2. {{ ok ? 'YES' : 'NO' }}
  3. {{ message.split('').reverse().join('') }}
  4. <div v-bind:id="'list-' + id"></div>

5. 指令

  1. <p v-if="seen">现在你看到我了</p>
  • 指令是带有v-前缀的特殊 attribute,指令 attribute 的值预期是单个 JavaScript 表达式

参考链接

基础:https://v3.cn.vuejs.org/guide/introduction.html