学习笔记《Vue》

继 AngularJS 和 React 之后,Vue 又为前端框架烧起了一把火,作者是华人,刚刚宣布加盟阿里的跨平台移动开发工具 Weex 担任技术顾问,Vue2 即将发布,作者最近一段时间一直在闭关创作

Vue 属于 MVVM 架构,区别于 MVC,这个可以参考网上的一个解释:

在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 MVC模型关注的是Model的不变,所以,在MVC模型里,Model不依赖于View,但是 View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的

MVVM在概念上是真正将页面与数据逻辑分离的模式,它把数据绑定工作放到一个JS里去实现,而这个JS文件的主要功能是完成数据的绑定,即把model绑定到UI的元素上

官网:http://vuejs.org/

部署很简单:

// latest stable $ npm install vue

功能:

模板功能:
<div id="app">
  {{ message }}
</div>

new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue.js!'
  }
})
双向绑定机制:
<div id="app">
  <p>{{ message }}</p>
  <input v-model="message">
</div>

new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue.js!'
  }
})
逻辑:

没有把循环交给模板机制,而是给了 HTML 的属性,非常的智慧

<div id="app">
  <ul>
    <li v-for="todo in todos">
      {{ todo.text }}
    </li>
  </ul>
</div>

new Vue({
  el: '#app',
  data: {
    todos: [
      { text: 'Learn JavaScript' },
      { text: 'Learn Vue.js' },
      { text: 'Build Something Awesome' }
    ]
  }
})

支持的逻辑有:

  • v-for 循环
  • v-if 布尔if 判断
  • v-show 对 CSS 的 display 做切换处理
  • v-else 布尔else 判断
事件

把事件也交给了 HTML 的属性来处理,防止外部加载的事件在模板处理以后丢失的好方法

<div id="app">
  <p>{{ message }}</p>
  <button v-on:click="reverseMessage">Reverse Message</button>
</div>

new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue.js!'
  },
  methods: {
    reverseMessage: function () {
      this.message = this.message.split('').reverse().join('')
    }
  }
})

调试

有一个叫做 Vue.js devtools 的 Chrome Developer Tools 集成插件,可以帮助到 Vue 的调试

代码里面注意要添加:

Vue.config.debug = true
Vue.config.devtools = true

组件机制

Vue 的组件机制,类似于一种使用面向对象的方式来撰写小部件的感觉,看一下这个例子:

HTML里面:

<ul id="productListTemplate">
    <product-list></product-list>
</ul>

<template id="productList">
    <li v-for="product in products">
        <div class="product-list-btn">
            <a href="/product/info/@{{ product.product.id }}">查看详情</a>
            <a href="/product">我要购买</a>
        </div>
    </li>
</template>

JS里面:

Vue.component('product-list', {
    template: '#productList',

    data: function() {
        return{
            products: []
        }
    },

    ready: function () {
        this.fetchProducts();
    },

    methods: {
        fetchProducts: function () {
            var products = [];
            this.$http.get('/api1.0/product/list')
                .then((response) => {
                    this.$set('products', response.body.data.items);
            }, (response) => {
                products.log(err);
            });
        },
    }
})

new Vue({
    el: '#productListTemplate'
})

一段输出页面和分页的代码:

<template id="productList">
    <ul class="product-list clearfix">
        <div class="col-sm-6 col-md-4" v-for="product in products">
            <h3>@{{ product.product.name }}</h3>
            <p>@{{ product.product.content }}</p>
        </div>
    </ul>
    <div class="cf-pagination" id="pagination">
        <ul class="pagination pagination-lg">
            <li v-if="pagination.pre_page"><a href="javascript:void(0)" v-on:click="fetchProducts(pagination.next_page)">«</a></li>
            <li :class="pagination.current_page == page ? 'active' : null" v-for="page in pagination.page_area"><a href="javascript:void(0)" v-on:click="fetchProducts(page)">@{{page}}</a></li>
            <li v-if="pagination.next_page"><a href="javascript:void(0)" v-on:click="fetchProducts(pagination.next_page)">»</a></li>
        </ul>
    </div>
</template>

<script>
Vue.component('product-list', Vue.extend({
    template: '#productList',

    data: function() {
        return{
            products: [], pagination: []å
        }
    },

    ready: function () {
        this.fetchProducts(1);
    },

    methods: {
        fetchProducts: function (page) {
            var products = [];
            this.$http.get(api_url + '/product/list/?page=' + page)
                    .then((response) => {
            this.$set('products', response.body.data.items);
            this.$set('pagination', response.body.data.pagination);
        }, (response) => {
                products.log(err);
            });
        },
    }
}))

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

推荐阅读更多精彩内容