Vue.js起步——基础篇

什么是Vue.js?

Vue.js,读音 /vjuː/,和view发音几乎一样,可见重心是在视图(view)层上的。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

与react.js做比较

react.js相比vue.js拥有更好的他们的生态系统和丰富的自定义渲染器。
在渲染用户界面的时候,DOM 的操作成本是最高的,相同的是两者都会尽量减少 DOM 操作。而vue还会尽量减少除 DOM 操作以外的其他操作。所以在性能上vue更胜一筹。
在react中所有的html/css都是写在js里的,会导致不少问题。而vue是创建一个模版,把他们写在模版中,最终渲染出来。

与Angular做比较

Angular 是 Vue 早期开发的灵感来源,所以在一定程度上有些类似,并且vue对其进行了一定优化,在复杂性方面vue的api相对简单太多,可以很快上手。在性能方面vue也拥有一定的优势,然而Angular虽然笨重但是功能强大。

来自Vue的Hello world!

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vue起步</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        {{show}}
    </div>
</body>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            show:'"Hello world!" from Vue.js'
        }
    })
</script>
</html>

简单的实现了一个字符串的渲染,看起来很简单,其实vue在背后做了很多操作,现在数据和 DOM 已经被绑定在一起了,我们可以通过app.show来修改,你可以看到页面相应的进行了更新。

构造器

为什么new了一个Vue,其实每一个Vue.js应用都是通过构造函数Vue创建一个Vue的根实例也就是这里说的构造器。

在实例化Vue时,需要传入一个选项对象,它可以包含数据、模板、挂载元素、方法、生命周期钩子等选项。全部的选项可以在 API 文档中查看。

还可以通过extend自定义扩展构造器(后面会具体说一下这里):

var MyComponent = Vue.extend({
  // 扩展选项
})
// 所有的 `MyComponent` 实例都将以预定义的扩展选项被创建
var myComponentInstance = new MyComponent()

一些v-指令

v-bind

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue起步</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app-2">
        <span v-bind:title="show">
            {{message}}
        </span>
    </div>
</body>
<script>
    var app = new Vue({
        el: '#app-2',
        data: {
            show:'You loaded this page on ' + new Date(),
            message: 'Hover your mouse over me for a few seconds to see my dynamically bound title!'
        }
    })
</script>
</html>

这个例子,我们可以看到除了绑定插入的文本内容,我们还可以采用这样的方式绑定 DOM 元素的属性。
v-bind被称为指令,在vue中v-开头就代表这是vue中提供的特殊属性。
同样app.show同样可以修改,页面也会进行相应更新。

v-if

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue起步</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <span v-bind:title="show" v-if="val">
            {{message}}
        </span>
    </div>
</body>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            val: false,
            show:'You loaded this page on ' + new Date(),
            message: 'Hover your mouse over me for a few seconds to see my dynamically bound title!'
        }
    })
</script>
</html>

v-if指令可以进行判断,绑定的值为true进行显示,绑定的值为false就不显示。
同样也可以在控制台修改app.val=true/false
这个指令最大的作用就是在用vue增删元素的时候,可以起到一次过滤效果。

v-for

v-for 指令可以绑定数据到模版来渲染一个列表

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vue起步</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
  <ul>
    <li v-for="item in todos">
      {{ item.text }}
    </li>
  </ul>
</div>
</body>
<script>
    var app = new Vue({
  el: '#app',
  data: {
    todos: [
      { text: '第一项' },
      { text: '第二项' },
      { text: '第三项' },
      { text: '第四项' },
      { text: '第五项' }
    ]
  }
})
</script>
</html>

通过v-for循环一个列表出来,与数据进行绑定,这样可以大大减少html页面的代码量,转换成遍历模版来渲染出页面。同样可以对todo数组进行操作。

v-on

为了让用户和我们的应用互动起来,我们可以用v-on指令绑定一个监听事件用于调用我们 Vue 实例中定义的方法。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vue起步</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <p>{{message}}</p>
        <button v-on:click="reverseMessage">操作数据</button>
    </div>
</body>
<script>
    var app = new Vue({
  el: '#app',
  data: {
    message:'Hello Vue.js!'
  },
  methods: {
    reverseMessage: function(){
        this.message = this.message.split('')
    }
  }
})
</script>
</html>

绑定了一个reverseMessage函数到button上。在这个过程中我们在没有接触 DOM 的情况下更新了页面的状态,所有的DOM操作都由Vue来处理,你写的代码只需要关注基本逻辑。

v-model

vue实现双向数据绑定,就可以从这个地方体现出来了。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vue起步</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <p>{{message}}</p>
        <input type="text" v-model="message">
    </div>
</body>
<script>
var app = new Vue({
    el: '#app',
    data: {
    message:'Hello Vue.js!'
    }
})
</script>
</html>

可以更改input里的值来逆向的更改message的值,从而映射到{{message}}中去。

构建组建

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vue起步</title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <ul>
            <todo-item v-for="todo in todos" v-bind:item="todo"></todo-item>
        </ul>
    </div>
</body>
<script>
Vue.component('todo-item',{
    props:['item'],
    template: '<li>{{ item.text }}</li>'
})

var app = new Vue({
    el: '#app',
    data: {
        todos: [
          { text: '第一项' },
          { text: '第二项' },
          { text: '第三项' },
          { text: '第四项' },
          { text: '第五项' }
        ]
    }
})


</script>
</html>

通过我们构建的组件现在可以在不影响到父应用的基础上,进一步为我们的todo做更多复杂的模板和逻辑。

组件系统是 Vue.js 另一个重要概念,因为它提供了一种抽象,让我们可以用独立可复用的小组件来构建大型应用。如果我们考虑到这点,几乎任意类型的应用的界面都可以抽象为一个组件树:
组建树图片,来自vue的官方文档
组建树图片,来自vue的官方文档

其中v-bind把数据传递出去,在component中用props接收bind传递过来的经过循环以后的数组。
当我们把一个大型项目分割成数个小的组件后我们的html代码应该是下面这个样子的,这样可以让我们整个开发过程更可控,也完成了解耦工作。

<div id="app">
  <app-nav></app-nav>
  <app-view>
    <app-sidebar></app-sidebar>
    <app-content></app-content>
  </app-view>
</div>

属性与方法

在前面有提到说我们在控制台中可以通过app.show来修改data里面的方法show,这是为什么呢?原因是每个 Vue 实例都会代理其 data 对象里所有的属性。

var data = { a: 1 }
var vm = new Vue({
  data: data
})
vm.a === data.a // -> true
// 设置属性也会影响到原始数据
vm.a = 2
data.a // -> 2
// ... 反之亦然
data.a = 3
vm.a // -> 3

ps:注意只有这些被代理的属性是响应的。如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。

除了 data 属性,Vue实例暴露了一些有用的实例属性与方法。这些属性与方法都有前缀 $,以便与代理的 data 属性区分。具体请查阅API文档中的实例属性一节。

MVC & MVVM模式

MVC = Module View Controller

MVC是一种在后端开发中广泛采用的架构模式,几乎所有的知名后端框架都是传统 MVC 的实现,由于其中的 一些小差异,也可以被叫做 MV*

MVC模式的意思是,软件可以分成三个部分。

  • 视图(View):用户界面。
  • 控制器(Controller):业务逻辑
  • 模型(Model):数据保存

各部分之间的通信方式如下

  1. View 传送指令到 Controller
  2. Controller 完成业务逻辑后,要求 Model 改变状态
  3. Model 将新的数据发送到 View,用户得到反馈
    所有通信都是单向的。

互动模式

接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。

test

另一种是直接通过controller接受指令。

MVVM = Module View ViewModule

它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。

vue核心关注的就是MVVM中的ViewModel

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容