vue快速上手

vue是一个基于响应式编程思想、模块化设计实现的js框架,可以大大简化开发,是前端开发的首选框架。

1、基础语法

下面这个demo演示了vue的基本使用:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Demo</title>
<!-- 这个是国内的vue cdn库 -->
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>

<body>

  <div id="app">

    <!-- 插值 -->
    <div>{{ test_message }}</div>
    <!-- 插值html模板 -->
    <div v-html="test_vhtml"></div>

    <!-- 遍历 -->
    <div>
      <li v-for="user in test_users">
        {{ user.name }}, {{ user.age }} years old.
      </li>
      <li style="list-style: none" v-for="(user, i) in test_users" :key="i">
          {{ i }}: {{ user.name }}, {{ user.age }} years old.
      </li>
    </div>

    <!-- 插值方法 -->
    <div>{{ test_func() }}</div>

    <!-- 计算 -->
    <div>1 + 2 = {{ 1 + 2 }}</div>
    <div>{{ test_bool ? "YES" : "NO" }}</div>

    <!-- 条件分支 -->
    <div v-if="test_bool">see me if test_bool is true</div>
    <div v-else>see me if test_bool is false</div>

    <!-- 绑定值 -->
    <div v-bind:id="'xxx' + test_bind_id">a h1 with id xxx-{{ test_bind_id }}</div>
    <a v-bind:href="test_url">a baidu link</a><br/>
    <!-- 简写形式 -->
    <div :id="'xxx' + test_bind_id">a h1 with id xxx-{{ test_bind_id }}</div>
    <a :href="test_url">a baidu link</a><br/>

    <!-- 绑定事件 -->
    <button v-on:click="test_click">a button</button><br/>
    <button v-on:click="test_click_count += 1">a button</button><span>{{ test_click_count }}</span><br/>
    <!-- 事件细节 -->
    <button v-on:click.once="test_click">a once click button</button><br/>
    <input v-on:keyup.enter="test_summit" placeholder="tap enter to summit"><br/>
    <!-- 简写形式 -->
    <button @click="test_click">a button</button><br/>

    <!-- 双向绑定 -->
    <input v-model="test_input_value"><span>{{ test_input_value }}</span><br/>
    <!-- 多选绑定 -->
    <input type="checkbox" id="check_a" value="a" v-model="test_options"><label for="check_a">A</label>
    <input type="checkbox" id="check_b" value="b" v-model="test_options"><label for="check_b">B</label>
    <input type="checkbox" id="check_c" value="c" v-model="test_options"><label for="check_c">C</label>
    <label>{{ test_options }}</label><br />
    <!-- 列表绑定 -->
    <select v-model="test_select">
      <option value="">choose</option>
      <option value="a">A</option>
      <option value="b">B</option>
    </select>
    <label>{{ test_select }}</label><br/>


    <!-- 绑定样式 -->
    <div v-bind:style="{ color: test_color }">test style</div>
    <div v-bind:class="{ test_class_active: test_bool }">test class</div>

    <!-- 过滤器 -->
    <div v-bind:id="'id-' + test_bool | test_filter_bool">a div with id id-{{ test_bool | test_filter_bool }}</div>
    <div>{{ test_message }} -> {{ test_message | test_filter_upcase }}</div>

    <!-- 监听器 -->
    <input v-model="test_money_dollar"><span>{{ test_money_yuan }}¥</span><br />

  </div>

  <style>
    .test_class_active {
      color: green;
    }
    .test_class_disable {
      color: gray;
    }
  </style>
  
  <script>
    new Vue({
      el: '#app',
      data: {
        test_message: "a test message",
        test_color: "#ff0000",
        test_vhtml: "<h5>a h5</h5>",
        test_bool: true,
        test_click_count: 0,
        test_money_yuan: 0,
        test_money_dollar: 0,
        test_users: [
          { name: 'Tom', age: 12 },
          { name: 'Helen', age: 11 },
          { name: 'Jack', age: 13 }
        ],
        test_options: [],
        test_select: "",
        test_bind_id: 1,
        test_url: "https://www.baidu.com",
        test_input_value: "the input text"
      },
      filters: {
        test_filter_upcase: function (value) {
          if (!value) return ''
          value = value.toString()
          return value.toUpperCase()
        },
        test_filter_bool: function (value) {
          if (value.booleanValue) {
            return "true"
          } else {
            return "false"
          }
        }
      },
      watch: {
        test_money_dollar: function (value) {
          this.test_money_yuan = value * 6
        }
      },
      methods: {
        test_func: function () {
          return "test_func(): " + this.test_message;
        },
        test_click: function () {
          alert("test_click()")
        },
        test_summit: function () {
          alert("test_summit()")
        }
      }
    })
  </script>
</body>
</html>

2、模块化

a、注册组件

<div id="app">
  <!-- 引用 -->
  <test_component_01></test_component_01>
  <test_component_02></test_component_02>
</div>
<script>
  // 注册全局组件
  Vue.component('test_component_01', {
    template: '<div>test component 01</div>'
  })
  // app实例
  new Vue({
    el: '#app',
    // 注册局部组件
    components: {
      'test_component_02': {
        template: '<div>test component 02</div>'
      }
    }
  })
</script>

b、模块间传值(父 --> 子),变量绑定及声明

<div id="app">
  <input v-model="parent_text"><br/>
  <!-- ② 绑定变量 -->
  <child v-bind:text_from_parent="parent_text"></child>    
</div>
<script>
  Vue.component('child', {
    // ① 声明变量
    props: ['text_from_parent'],
    template: "<span>{{ text_from_parent }}</span>"
  })
  new Vue({
    el: '#app',
    data: {
      parent_text: "parent text"
    }
  })
</script>

props后面的参数也可以以map的形式提供,以实现参数限定,例如:

props: { 
  varA: Number,
  varB: [String, Number],
  varC: {
    type: Number, 
    required: true,
    default: 1
  },
  varD: {
    validator: function (value) {
      return value > 10
    }
  }
}

c、模块间传值(子 --> 父),事件监听

<div id="app">
    <div>{{ count }}</div>
    <!-- ② 注册事件监听 -->
    <child v-on:update="childRespondUpdate"></child>
</div>
  
<script>
Vue.component('child', {
  template: '<button v-on:click="onClick">click me to change parent</button>',
  data: function () {
    return {
      count: 0
    }
  },
  methods: {
    onClick: function () {
      this.count += 1
      // ① 在子控件更新的方法中,触发事件
      this.$emit('update', this.count)
    }
  },
})
new Vue({
  el: '#app',
  data: {
    count: 0
  },
  methods: {
    // ③ 执行更新
    childRespondUpdate: function (value) {
      this.count = value
    }
  }
})
</script>

3、路由(router)

路由是vue的一个页面切换组件,基本使用如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Router Demo</title>
<!-- 这个是国内的vue cdn库 -->
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
<!-- vue router库 -->
<script src="https://cdn.staticfile.org/vue-router/2.7.0/vue-router.min.js"></script>
</head>

<body>
  <div id="app">
      <!-- 普通链接 -->
      <router-link to="/a">a-path</router-link>
      <router-link to="/b">b-path</router-link>
      <br/>

      <!-- 通过名字访问 -->
      <router-link v-bind:to="{ name:'a' }">a-name</router-link>
      <router-link v-bind:to="{ name:'b' }">b-name</router-link>
      <br/>

      <!-- 带参数 -->
      <router-link v-bind:to="{ path:'/a', query: { param: 'value' } }">a-param</router-link>
      <router-link v-bind:to="{ path:'/b', query: { param: 'value' } }">b-param</router-link>
      <br/>

      <!-- 指定tag类型 -->
      <router-link to="/a" tag="button">a-tag</router-link>
      <router-link to="/b" tag="button">b-tag</router-link>
      <br/>

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

推荐阅读更多精彩内容