vue入门

189 阅读3分钟

一、基础

特点

  • 更加轻量 20KB min+ gzip
  • 渐进式框架
  • 响应式的更新机制
  • 学习成本低

项目代码 gitee.com/geektime-ge…

内容

  • 基础篇
    • 核心知识
  • 生态篇
    • 大型项目 需要的周边技术
  • 实战篇
    • 开发基于VUE的Ant design pro
  • vue 3.0

声明式渲染

  • 通过 v-bind:id或者--:id 绑定动态值
<div id="app">
    {{message}} {{message+message}}
<!--    通过 v-bind:id或者--:id 直接动态的引入变量 !-->
    <div v-bind:id="message"></div>
    <div :id="message"></div>
</div>
<!--引入js-->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
    var vm = new Vue({
    el:"#app",
    data: {
        message: "hello world!"
        }
    })
</script>

条件与循环

  • 使用几个指令 v-if v-else v-for 展示效果

image.png

<div id="app">
    <ul>
        <li v-for="item in list">
            <span v-if="!item.del"> {{item.title}} </span>
            <span v-else style="text-decoration: line-through"> {{item.title}} </span>
            <button v-show="!item.del">删除</button>
        </li>
    </ul>
</div>


<!--引入js-->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
    var vm = new Vue({
    el:"#app",
    data: {
        list: [
        {title: "课程1", del: false},
        {title: "课程2", del: true}],
    }
    })
</script>

总结

  • 插值方法 {{}}
  • 指令 通过 v-bind:id或者--:id 绑定动态值
  • 指令 v-if v-else v-for

组件化应用构建

基本套路定义一个组件 即通过 Vue.component定义一个实例 然后定义一个app将原始数据和实例进行耦合 然后创建Vue实例

Vue实例要求具备:

  • name部分 定义名称
  • props部分 定义好都有哪些属性 以便后面的模版进行调用
  • template部分 渲染的模版

这块有点和jinja2类似 都是定义好模版 然后在模版中加入一些数据、变量的处理逻辑

demo

<div id="app-2">
    <ol>
        <todo-item
                <!v-bind:xxx 定义变量-->
                v-for="item in groceryList"
                v-bind:todo="item"
                v-bind:key="item.id"
                v-bind:name="item.text">
        </todo-item>
    </ol>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
    Vue.component('todo-item', {
        <!props定义有哪些属性属性 需要和创建todo-item实例的时候进行耦合 -->
        props:['todo', 'key', 'name'],
        template: '<li> {{key}} + {{name}} </li>'
        }
    )

    var app2 = new Vue({
        el: "#app-2",
        data:{groceryList: [
          { id: 0, text: '蔬菜' },
          { id: 1, text: '奶酪' },
          { id: 2, text: '随便其它什么人吃的东西' }
        ]
        }
    })

</script>

渲染示例

image.png

二、Vue实例

创建实例

// 创建一个数据对象
var result = { a: 1 , age: 18, name: "wangfei" }

// 将对象result 加入到一个 Vue实例中
var vm = new Vue({
  data: result
})

// 获得这个实例上的 property
// 返回源数据中对应的字段
vm.a == data.a // => true

// 设置 property 也会影响到原始数据
vm.a = 2
data.a // => 2

// ……反之亦然
data.a = 3
vm.a // => 3

注意 如果不想让实例的属性被修改 可以使用 Object.freeze(),这会阻止修改现有的 property

var obj = {
  foo: 'bar'
}

Object.freeze(obj)

var vm2 = new Vue({
  el: '#app',
  data: obj
})
vm2.foo = "123" 

实例生命周期钩子

  • 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。

  • 同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。

  • 钩子函数有:

    • created 钩子可以用来在一个实例被创建之后执行代码
    • mounted
    • updated
    • destroyed

生命周期图示

image.png

三、模版语法

  • Vue.js 使用了基于 HTML 的模板语法
  • 允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据
  • 在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数。
  • 结合响应系统,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少。

1.展示文本类型

使用“Mustache”语法 (双大括号) {{}} 的文本插值

<span>Message: {{ msg }}</span>

通过使用 v-once 指令 执行一次性地插值,当数据改变时,插值处的内容不会更新。

<span v-once>这个将不会改变: {{ msg }}</span>

2.展示 原始HTML 类型

双大括号 {{}} 会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,需要使用 v-html 指令

有点类似jinja2中的拦截器 比如 |safe

注意:你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值。

demo

<div id="app2">
    <span>普通文本:{{name}}</span>
    <br> 原始HTML
    <span v-html="name"> </span>
</div>

<!--引入vue js-->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
    var app2 = new Vue({
    el: "#app2",
    data: {name: '<b>this is a test!</b>'}
    })
</script>

示例

image.png

3.属性(Attribute)

Mustache 语法不能作用在 HTML attribute 上,应该使用 v-bind 指令 绑定变量

<div v-bind:id="dynamicId"></div>

demo

<div id="app2">
    <div v-bind:id="dynamicId"></div>
    <button v-bind:disabled="isButtonDisabled">Button</button>
</div>

<!--引入vue js-->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
    var app2 = new Vue({
    el: "#app2",
    data: {
            dynamicId: "123",
            isButtonDisabled: false
        }
    })
</script>

如果 isButtonDisabled 的值是 null、undefined 或 false,则 disabled attribute 甚至不会被包含在渲染出来的<button>元素中

示例1(disabled变量值false)

image.png

示例2(disabled变量值true)

image.png

4.使用 JavaScript 表达式