我的Vue朝圣之路2

1.创建第一个Vue案例

   1. 引入Vue.js
   2. 创建Vue对象
      el : 指定根element(选择器)
      data : 初始化数据(页面可以访问)
  3. 双向数据绑定 : v-model
  4. 显示数据 : {{xxx}}
  5. 理解vue的mvvm实现

<div id="test">
  <input type="text" v-model="msg">
  <p>{{msg}}</p>
</div>

<script type="text/javascript">
new Vue({
el: '#test',
data: {
msg: 'helloVue'
}
})
</script>

  

2.列表

   1. 在data中初始数组数据
   2. 在页面中遍历显示: v-for
       数据: [
                {id : 1, name : '张三'},
                {id : 2, name : '李四'},
                {id : 3, name : '王五'}
            ]

 

<div id="app">
  <ul>
    <li v-for="(todo, index) in todos">{{index+1}}----{{todo.id+'+++'+todo.name}}</li>
  </ul>
</div>


<script type="text/javascript">
  new Vue({
    el: '#app',
    data: function () {

      return {
        todos: [
          {id : 2, name : '张三'},
          {id : 3, name : '李四'},
          {id : 5, name : '王五'}
        ]
      }
    }
  })
</script>

 

3.事件

   1. 绑定监听的指令:
       v-on:xxx="函数名或函数调用"
      @xxx="函数名或函数调用"
   2. 定义事件处理的函数:
       methods : {
            函数名 : function(){...}
         }

<div id="app"><!--就是mvvm中的view-->
  <p>{{msg}}</p>
  <!--<button v-on:click="reverse">倒序</button>-->
  <button @click="reverse">倒序</button>
</div>

<script type="text/javascript">
  new Vue({ // vm对象
    el : '#app',
    data : { // 一般数据  model对象
      msg: 'I Love You!'
    },
    methods: { // 事件回调函数
      reverse () {
        //this是Vue实例对象
        this.msg = this.msg.split('').reverse().join('')
      }
    }
  })
</script>

 

3.综合使用

  1. 页面指令:
      v-model
     @click
     @keyup.enter
     v-for / $index
     v-text
  2. Vue对象
      初始化数据: data
      事件处理函数: methods

<div id="app">
  <input type="text" v-model="inputTodo" @keyup.enter="addTodo">
  <ul>
    <li v-for="(todo, index) in todos">
      {{todo.name}}
      <button @click="removeTodo(index)">X</button>
    </li>
  </ul>
</div>

<script type="text/javascript">
  new Vue({
    el : '#app',
    data : {
      inputTodo: '',
      todos: [
        {id : 2, name : '吃饭'},
        {id : 3, name : '睡觉'},
        {id : 5, name : '打豆豆'}
      ]
    },
    methods : {
      addTodo () {
        // 判断是否是正常输入
        var inputTodo = this.inputTodo.trim()
        if(!inputTodo) {
          return
        }
        // 根据输入创建todo对象
        var todo = {
          id: Date.now(),
          name: inputTodo
        }
        // 添加到todos
        this.todos.unshift(todo)
        // 清除输入数据
        this.inputTodo = ''
      },
      removeTodo (index) {
        this.todos.splice(index, 1)
      }
    }
  })
</script>

 

4.模板语法

  1. 表达式 :
      语法: {{exp}} 或 {{{exp}}}
      功能: 向页面输出数据
      可以调用对象的方法
  2. 强制数据绑定:
      完整写法:
      v-bind:xxx='yyy' //yyy会作为表达式解析执行
      简洁写法:
      :xxx='yyy'
  3. 事件监听:
      完整写法:
      v-on:keyup='xxx'
      v-on:keyup='xxx(参数)'
      v-on:keyup.enter='xxx'
      简洁写法:
     @keyup='xxx'
     @keyup.enter='xxx'

<div id="app">

  <h2>1. 表达式</h2>
  <p>{{message}}</p>
  <p>{{message.toUpperCase()}}</p>
  <h2>2. 强制数据绑定:</h2>
  <a :href="url">跳转</a>

  <h2>3. 事件监听:</h2>
  <input type="text" @keyup.enter="test">
  <input type="text" @keyup.enter="test2($event, 'abc')">

  <!--模板页面自动去vm对象中找属性-->
</div>

<script type="text/javascript">
  var vm = new Vue({
    el : '#app',
    data : {
      message: 'atguigu.com',
      url: 'http://www.xxxx.com'
    },
    methods : {
      test (event) {
        alert(event.target.value)
      },
      test2 (event, msg) {
        alert(event.target.value + '----'+msg)
      }
    }
  })
  console.log(vm) // 数据代理(vm代理data中数据的操作(读/写))
  vm.message = "xfzhang"

 

5.计算属性

   计算属性
        1. 在computed属性对象中定义计算属性的方法
        2. 在页面中使用{{方法名}}来显示计算的结果
   监视属性:
       1. 通过通过vm对象的$watch()或watch配置来监视指定的属性
       2. 当属性变化时, 回调函数自动调用, 在函数内部进行计算
  计算属性高级:
      1. 通过get/set方法实现对属性数据的显示和监视
      2. 计算属性存在缓存, 多次读取只执行一次

<div id="demo">
  姓: <input type="text" placeholder="First Name" v-model="firstName"><br>
  名: <input type="text" placeholder="Last Name" v-model="lastName"><br>
  姓名1(单向): <input type="text" placeholder="Full Name" v-model="fullName1">--{{fullName1}}<br>
  姓名2(单向): <input type="text" placeholder="Full Name" v-model="fullName2"><br>
  姓名3(双向): <input type="text" placeholder="Full Name2" v-model="fullName3"><br>
</div>

<script type="text/javascript">
  var vm = new Vue({
    el : '#demo',
    data : {
      firstName: '上官',
      lastName: '婉儿',
      fullName2: '上官-婉儿'
    },
    computed: {
      fullName1 () { // 相当于只是指定了get
        console.log('fullName1()')
        return this.firstName + '-' + this.lastName
      },
      fullName3: {
        get () {// 获取当前属性值, 当读取当前属性值时回调
          return this.firstName + '-' + this.lastName
        },
        set (value) { // 监视当前属性值的变化, 当属性值发生变化时调用
          var names = value.split('-')
          this.firstName = names[0]
          this.lastName = names[1]
        }
      }
    },

    watch: {
      firstName (value) {
        // 更新fullName2
        this.fullName2 = value + '-' + this.lastName
      }
    }
  })

  // 监视lastName
  vm.$watch('lastName', function (value) {
    // 更新fullName2
    this.fullName2 = this.firstName + '-' + value
  })
</script>

 

6.class与style绑定

   动态绑定class
      :class="a" a是一个data属性
      :class="{ 'class-a': isA, 'class-b': isB }" 其中isA/isB是布尔型data属性
      :class="[classA, classB]" 其中classA/classB是字符串值
  动态绑定style
      :style="{ color: activeColor, fontSize: fontSize + 'px' }" 其中activeColor/fontSize是data属性

<div id="demo">
  <p class="classB" :class="a">测试v-bind:class 变量语法</p>
  <p :class="{classA:isA, classB:isB}">测试v-bind:class 对象语法</p>
  <p :class="['classA', classB]">测试v-bind:class 数组语法</p>

  <p :style="{ color: activeColor, fontSize: fontSize + 'px' }">测试v-bind:style</p>
</div>

<script type="text/javascript">
  new Vue({
    el : '#demo',
    data : {
      a: 'classA',
      isA: false,
      isB: true,
      classB: 'classB',
      activeColor: 'green',
      fontSize: 30
    }
  })
</script>

 

7.条件渲染

    切换一个元素:
        v-if
        v-else
        v-show
   切换多个元素
       <template v-if="ok"> //不能用v-show
   注意:
      如果需要频繁切换 v-show 较好,如果在运行时条件不大可能改变 v-if 较好

<div id="demo">
  <h1>测试: 切换一个元素</h1>
  <p v-if="ok">aaaaa</p>
  <p v-else>bbbbbb</p>

  <p v-show="ok">sssssss</p>

  <h1>测试: 切换多个元素</h1>

  <template v-if="ok">
    <h2>xxxx</h2>
    <h2>yyyy</h2>
    <h2>zzzzz</h2>
  </template>

  <button @click="ok=!ok">切换</button>
</div>

<script type="text/javascript">
  new Vue({
    el : '#demo',
    data : {
      ok: false
    }
  })
</script>

 

8.列表渲染

   1. 遍历显示数组 : v-for / index
   2. 遍历显示对象 : v-for / key

<div id="demo">

  <h2>测试: v-for 遍历数组</h2>
  <ul>
    <li v-for="(p, index) in filterPersons">
      {{index}}--{{p.name}}--{{p.age}}
      --<button @click="removeP(p)">删除</button>
      --<button @click="updateP(p, {name:'Cot', age:18})">更新</button>
    </li>
  </ul>
  <h2>测试: v-for 遍历对象</h2>
  <ul>
    <li v-for="(value, key) in persons[1]">
      {{key}}----{{value}}
    </li>
  </ul>
</div>

<script type="text/javascript">
  new Vue({
    el : '#demo',
    data : {
      persons: [
        {name: 'Tom', age: 12},
        {name: 'Jack', age: 15},
        {name: 'Bob', age: 14}
      ]
    },

    methods: {
      removeP (p) {
        // 得到元素在数组中下标
        var index = this.persons.indexOf(p)
        // 删除
        this.persons.splice(index, 1)
      },
      updateP (oldP,newP) {
        // 得到元素在数组中下标
        var index = this.persons.indexOf(oldP)
        console.log(index)
        // 更新下标所对应的数组元素
        // this.persons[index] = newP
        this.persons.splice(index, 1, newP)
      }
    },

    computed: {
      filterPersons () {
        // 哪些数组元素会放入返回的数组中? 只有回调函数返回值为true的p
        return this.persons.filter(p => p.name.indexOf('o')>=0)
      }
    }
  })
</script>

 

9.方法与事件处理器

  1. 绑定监听:
      v-on:xxx="fun"
      @xxx="fun"
      @xxx="fun(参数)"
      默认事件形参: event
      隐含属性对象: $event
  2. 事件修饰符:
      .prevent : 阻止事件的默认行为 event.preventDefault()
      .stop : 停止事件冒泡 event.stopPropagation()
  3. 按键修饰符
      .keycode : 操作的是某个keycode值的健
      .enter : 操作的是enter键

<div id="example">

  <h2>1. 绑定监听</h2>
  <button v-on:click="test1">测试1</button>
  <button @click="test1">测试2</button>
  <button @click="test2('abc', $event)">测试3</button>

  <h2>2. 事件修饰符</h2>
  <!--阻止事件的默认行为-->
  <p><a href="http://baidu.com" @click.prevent="test3">百度</a></p>
  <!--停止事件冒泡-->
  <div style="background: red;width: 300px;height: 300px" @click="test4">
    <div style="background: yellow;width: 200px;height: 200px" @click.stop="test5"></div>
  </div>

  <h2>3. 按键修饰符</h2>
  <input type="text" @keyup.enter="test6">
  <input type="text" @keyup.65="test6">
</div>

<script type="text/javascript">
  new Vue({
    el : '#example',
    data : {

    },
    methods : {
      test1 (event) {
        alert(event.target.innerHTML)
      },
      test2 (msg, event) {
        alert(msg + '---' + event.target.innerHTML)
      },
      test3 () {
        alert('点击链接')
      },
      test4 () {
        alert('点击了外部div')
      },
      test5 () {
        alert('点击了内部div')
      },
      test6(event) {
        alert(event.keyCode + '---' + event.target.value)
      }
    }
  })
</script>

 

10.表单控件绑定

    1. 使用v-model对表单项数据双向绑定
        text/textarea
        checkbox : 绑定boolean/string值
        radio
        select
   2. 失去焦点才更新: .lazy
   3. 自动去除两端空格: .trim

<div id="demo">
  <input type="text" v-model="msg"><br>
  <textarea cols="30" rows="5" v-model="msg"></textarea>
  <p>{{msg}}</p>

  <hr>
  <input type="checkbox" v-model="ok"> {{ok}}<br>
  <input type="checkbox" name="students" value="Tom" v-model="selectStudents">TOM
  <input type="checkbox" name="students" value="Jack" v-model="selectStudents">JACK
  <input type="checkbox" name="students" value="Bob" v-model="selectStudents">BOB
  {{selectStudents}}
  <hr>

  <input type="radio" name="sex" value="male" v-model="sex"><input type="radio" name="sex" value="female" v-model="sex">女
  {{sex}}
  <hr>

  <select name="city" v-model="selectCityId">
    <option :value="city.id" v-for="city in citys">{{city.name}}</option>
  </select>
  {{selectCityId}}
  <hr>

  <input type="text" placeholder="失去焦点才同步数据" v-model.lazy="msg2">{{msg2}}
  <input type="text" placeholder="自动trim" v-model.trim="msg3">---{{msg3}}---
</div>

<script type="text/javascript">
  new Vue({
    el : '#demo',
    data : {
      msg: 'atguigu',
      ok: true,
      selectStudents: ['Jack'],
      sex: 'female',
      citys: [
        {id: 1, name: 'BJ'},
        {id: 3, name: 'SZ'},
        {id: 5, name: 'SH'}
      ],
      selectCityId: 3,
      msg2: '',
      msg3: ''
    }
  })
</script>

 

转载于:https://www.cnblogs.com/MingQiu/p/11065827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值