『翻译』Vue.js简介:Rendering, Directives, and Events

开头

如果让我用一句话总结我对 Vue 的理解,我可能会这样说“它真的非常好理解”或者“它就像一个工具,我可以随心所欲的使用它,而又不会受制于它”。在我学习 Vue 的过程中,我非常的开心,因为它很有意思,很优雅。
这篇文章是我个人对 Vue 的了解。当我第一次学习 Vue 的时候,我希望能有一篇这样的文章帮助指导我学习。如果你想要通过权威的方式学习 Vue 的话,那么你可以参考 Vue 官网的指南,非常的详细,简单明了。

Vue.js简介(1)
Vue.js简介(1)

文章系列

Part 1: Rendering, Directives, and Events
Part 2: Components, Props, and Slots (待翻译)
Part 3: Vue-cli (待翻译)
Part 4: Vuex (待翻译)
Part 5: Animations (待翻译)

Vue 吸取并融合了其它框架的成功之处,并且它的代码非常简洁,这是我非常喜欢它的一个原因。比如下面这些特点:

  • 虚拟的 DOM 和灵活的组件,提供了一种 View 层优先,props ,并且类似于 React 的 Redux 式的存储方式。
  • 类似于 Angular 的条件渲染和数据绑定方式。
  • 在简单性和性能方面,受到 Polymer 的启发,Vue 采用了相同的 HTML 代码,styles 样式和 JavaScript 代码书写方式。

还有其它的一些相对于它的对手的优点,也让我觉得欣喜:更干净,更语义化的 API 文档,相比 React 更好的表现,和 Polymer 一样不采用 polyfills,并且是一个独立而又不像 Angular 那样固执己见的 MVVM 框架。


接下来我们继续,或许你亲自去阅读他们社区的与其他框架的比较会更好。它很值得一读,如果你更愿意去书写代码的话,那么你可以跳过它。

让我们开始吧!

让我们从 "Hello,world!" 开始。按照下面这样做你就可以开始了:

<div id="app">
 {{ text }} Nice to meet Vue.
</div>
new Vue({
 el: '#app',
 data: {
   text: 'Hello World!'
 }
});

DEMO
如果你对 React 很了解的话,这种写法你也一定觉得很熟悉。通过 JavaScript 创建变量,用双大括号模板引用变量,不同的使 Vue 直接采用 Html,而 React 采用JSX语法。JSX 语法很容易上手,但是
Vue 不用把 class 转化为 className 等简洁的写法,让我真的很喜欢它。你可能也注意到Vue非常的轻量,运行起来也很迅速。
接下来我们一起尝试下Vue的一些令人喜爱的特性:循环和条件渲染。

条件渲染

我创建了一个items对象,类似导航,以便我知道我可以重用它。把它定义为一个数组可能更有意义,方便以后动态地更改。如果按照原生的 JS 写法可能会是这样的:创建数组,然后创建空的字符串对象,再把数组的每个条目嵌套上 <li> 标签,最后在外面嵌套 <ul> 标签,最后使用 innerHTML 方法操作 DOM:

<div id="container"></div>

const items = [
  'thingie',
  'another thingie',
  'lots of stuff',
  'yadda yadda'
];

function listOfStuff() {
  let full_list = '';
  for (let i = 0; i < items.length; i++) {
      full_list = full_list + `<li> ${items[i]} </li>`
  }
  const contain = document.querySelector('#container');
  contain.innerHTML = `<ul> ${full_list} </ul>`;     
}

listOfStuff();

DEMO
没问题,但是有点凌乱。现在让我们用
Vue 的循环v-for实现同样的效果:

<div id="app">
  <ul>
    <li v-for="item in items">
      {{ item }}
    </li>
  </ul>
</div>
const app4 = new Vue({
  el: '#app',
  data: {
    items: [
      'thingie',
      'another thingie',
      'lots of stuff',
      'yadda yadda'
    ]
  }
});

DEMO

非常的简单明了。如果你了解 Angular,这种写法对你来说肯定很熟悉。这样的条件渲染方式非常的简单,清晰。如果你还在用传统的原生 JS 而且也在寻求改变,那么你可以很容易上手 Vue。

另外一个非常好用的指令是v-model,它可以动态绑定数据。像这样:

<div id="app">
  <h3>Type here:</h3>
  <textarea v-model="message" class="message" rows="5" maxlength="72"></textarea><br>
  <p class="booktext">{{ message }} </p>
</div>
new Vue({
  el: '#app',
  data() {
    return {
      message: 'This is a good place to type things.'  
    }
  }
});

DEMO

通过上面的例子,你可能注意到两点。首先,页面没有进行任何 DOM 操作,就能够动态的更新显示的文本内容。Vue 能够通过 v-model 指令在 <textarea><p> 标签之间创建双向的数据绑定,来实现页面展示数据的动态变换。另外一点,我们把数据存放在函数里面,没有调用这个函数,它自己就工作了。像以前的例子一样,我们也可以把它放在一个对象内部。但是它只会在 Vue 实例或者完全相同的应用下工作。Vue 实例可以引用它,并且所有的子组件也可以获取它的数据。把数据存储在函数里面是一个很好的做法,因为当我们开始使用组件并且还想让各组件保持各自的状态,我们就可以采取这种存储方式。
这些并不是唯一的简单的输入绑定,v-if可以切换,v-show显示或隐藏 DOM 。
这儿有更多的指令可供你参考。

事件处理

数据绑定确实不错,但是没有事件的处理我们什么也做不了,所以我们跳过它,开始讲事件处理!这一部分也是我非常喜爱的部分。我们将通过绑定和监听器的去监听 DOM 事件。

new Vue({
  el: '#app',
  data() {
   return {
    counter: 0
   }
  },
  methods: {
   increment() {
     this.counter++;
   }
  }
});

<div id="app">
  <p><button @click="increment">+</button> {{ counter }}</p>
</div>

我们创建了一个方法叫做increment,并且我们可以看到它自动绑定了this,然后引用了此实例中的数据和组件。不需要我们手动去操作。
Methods并不是唯一创建自定义函数的方式,你还可以通过watch方法。两种方式的不同之处主要在于methods适合小的同步计算,而watch则更有助于处理多任务的,异步的,消耗资源的不断更新数据的操作。我经常会用watch去实现动画效果。
让我们再深入一点,看看如何传递事件病进行一些动态的样式绑定。如果你还记得上面表格的内容,你可以使用快捷写法:代替v-bind,接下来我们可以通过:style或者:class方式很容易的绑定样式并且传递状态。像这样的绑定方式还有很多。
在下面的例子里面,我们采用hsl()方法——是通过对色相(H)、饱和度(S)、明度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的方法。当我们的鼠标在屏幕上运动时,指针在屏幕上的位置就会发生变化,背景风格将得到相应的更新。在这里我们使用了ES6的模版字面量

<div id="app" :style="{ backgroundColor: `hsl(${x}, 80%, 50%)` }" @mousemove="xCoordinate">
  <p><button @click="increment">+</button> {{ counter }} <button @click="decrement">-</button></p>
  <p>Pixels across: {{ x }}</p>
</div>
new Vue({
  el: '#app',
  data() {
    return {
      counter: 0,
      x: 0
    }
  },
  methods: {
    increment() {
      this.counter++;
   },
   decrement() {
     this.counter--;
   },
   xCoordinate(e) {
     this.x = e.clientX;
   }
  }
});

DEMO
可以看到我们甚至不需要将事件传递给@click处理程序,Vue 就可以自动把它作为方法的参数传递。
当然了,原生的方法也可以做到,比如说event.clientX,并且和this实例结合起来会更简单。在下面的例子你将看到 Vue 操作起来是多么的简单和语义化。
我们甚至不需要创建方法,我们只需在组件内部的行内样式里添加操作就足够了:

<div id="app">
  <div class="item">
    ![](https://s3-us-west-2.amazonaws.com/s.cdpn.io/28963/backpack.jpg)
    <div class="quantity">
      <button class="inc" @click="counter > 0 ? counter -= 1 : 0">-</button>
      <span class="quant-text">Quantity: {{ counter }}</span>
      <button class="inc" @click="counter += 1">+</button>
    </div>
    <button class="submit" @click="">Submit</button>
  </div><!--item-->
</div>
new Vue({
  el: '#app',
  data() {
    return {
      counter: 0
    }
  }
});

DEMO
你可以看到我们更新状态是直接通过@click处理程序而没有使用函数方法,还可以添加一些简单逻辑处理。但是一旦你的逻辑变得过于复杂,这样的做法就会让代码的可读性变的很差,这时候你就可以考虑把它放在一个函数方法内部,通过method来存储,无论如何这将会是一个好的选择。

文章系列:

Part 1: Rendering, Directives, and Events
Part 2: Components, Props, and Slots (待翻译)
Part 3: Vue-cli (待翻译)
Part 4: Vuex (待翻译)
Part 5: Animations (待翻译)


注释:原文作者:Sarah Drasner,本文已得到作者授权。

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

推荐阅读更多精彩内容