1. vue 事件绑定

Vue 事件绑定,需要 v-on 指令,v-on: 可以简写成@;后面跟不带 on 的事件名
v-on: 事件名绑定一个函数名,这个函数名去 methods 里面找;

  1. <div id="app">
  2. <button @click="fn">点我试试</button>
  3. <button @click="fn(x, y)">点我试试2</button>
  4. <button @click="fn($event, 3, 4)">点我试试3</button>
  5. <div class="box" v-if="flag">A</div>
  6. </div>
  7. <script src="vue.js"></script>
  8. <script>
  9. let vm = new Vue({
  10. el: '#app',
  11. data: {
  12. flag: true,
  13. x: '0001',
  14. y: '0002'
  15. },
  16. methods: {
  17. fn(e, a, b) {
  18. // 1. 在绑定事件时不传参,事件函数第一个参数是事件对象;
  19. // 2. 如果在绑定事件时传参了,传了啥,参数接收到的就是啥
  20. // 3. 如果既想用事件对象,又想传参,需要在绑定事件时,小括号里面第一个写 $event,后面再写真实的参数
  21. // console.log(e);
  22. // console.log(a);
  23. // console.log(b);
  24. // console.log(123);
  25. this.flag = !this.flag; // this.flag 访问flag
  26. },
  27. gn(x, y) {
  28. this.fn();
  29. }
  30. }
  31. })
  32. </script>

2. vue 事件修饰符

事件修饰符是为了方便 Vue 中的事件处理,特有的一种修饰符号;
用法:@事件名.修饰符
事件修饰符可以连用:@click.prevent.stop


常见的事件修饰符
.prevent 阻止元素的默认行为
.stop 阻止事件冒泡
.capture 事件在捕获阶段触发
.once 事件只会执行一次
.self 自身的事件触发时才执行事件函数

键盘事件修饰符
.enter 回车
.esc esc键
.delete 删除键
.space 空格
.tab tab键
.up 上键
.down 下
.left 左
.right 右

  1. <div id="app">
  2. <a href="https://www.baidu.com" @click.prevent="fn">百度</a>
  3. <div @click="parent">
  4. parent
  5. <div @click="child">
  6. child
  7. <div @click.stop="grandchild">
  8. grandson
  9. </div>
  10. </div>
  11. </div>
  12. <div>
  13. <input type="text" v-model="num" @keydown.up="add">
  14. </div>
  15. </div>
  16. <script src="vue.js"></script>
  17. <script>
  18. let vm = new Vue({
  19. el: '#app',
  20. data: {
  21. num: 1
  22. },
  23. methods: {
  24. add () {
  25. this.num++; // 通过 this.num 来访问 data 里面的 num
  26. },
  27. fn() {
  28. console.log(1);
  29. },
  30. parent() {
  31. console.log('parent');
  32. },
  33. child() {
  34. console.log('child');
  35. },
  36. grandchild() {
  37. console.log('grandchild');
  38. }
  39. }
  40. });
  41. </script>

3. 简易 todolist

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport"
  6. content="width=device-width, user-scalable=no,
  7. initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  8. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  9. <title>simple todolist</title>
  10. </head>
  11. <body>
  12. <div id="app">
  13. <input type="text"
  14. id="todoInput"
  15. @keydown.enter="add"
  16. v-model="todo">
  17. <ul id="list">
  18. <li v-for="(item, index) in todoList" :key="index">
  19. {{item}}
  20. <button @click="remove(index)">删除</button>
  21. </li>
  22. </ul>
  23. </div>
  24. <script>
  25. /* let input = document.getElementById('todoInput');
  26. let list = document.getElementById('list');
  27. input.onkeydown = function (e) {
  28. if (e.keyCode === 13) {
  29. let str = `<li>${this.value} <button>删除</button></li>`;
  30. list.innerHTML += str;
  31. }
  32. };
  33. list.onclick = function (e) {
  34. if (e.target.nodeName.toUpperCase() === 'BUTTON') {
  35. list.removeChild(e.target.parentNode)
  36. }
  37. }*/
  38. </script>
  39. <script src="vue.js"></script>
  40. <script>
  41. let vm = new Vue({
  42. el: '#app',
  43. data: {
  44. todo: '',
  45. todoList: []
  46. },
  47. methods: {
  48. remove(index) {
  49. this.todoList.splice(index, 1);
  50. },
  51. add() {
  52. // this.todo 和 input 是双向数据绑定的,我们在 input 中输入内容,vue 会把 input 中
  53. // 的值保存到 this.todo 上
  54. this.todoList.push(this.todo);
  55. this.todo = ''; // 添加到 todoList 后,清空 input
  56. }
  57. }
  58. });
  59. </script>
  60. </body>
  61. </html>

Vue 是数据驱动,不需要我们操作 DOM;我们只需要操作数据,当 Vue 发现数据变化了,它会把页面中用到这个数据的所有地方按照数据的最新值重新渲染;视图(HTML)是数据的映射,所谓映射是一个改另一个跟着改;当数据发生变更后,视图也会跟着改

4. 过滤器

过滤器:是一种处理数据但是不会改变原数据的数据处理方式,一般用来格式化数据
| 叫做管道符,把它前面的值传递给过滤器函数的第一个参数;然后数据就会展示成过滤器函数的返回值;过滤器可以连续使用,后面的过滤器的参数,是上一个过滤器的处理结果,数据会展示成最后一个过滤器的结果;过滤器可以传参,参数是传给第二个形参的,第一个参数是管道符前面的值

  1. <div id="app">
  2. <ul>
  3. <li v-for="(item, index) in products" :key="index">
  4. 商品{{item.name}}
  5. 价格{{item.price | toDollar}}
  6. 国行{{item.price | toRMB | toFixed(3)}}
  7. </li>
  8. </ul>
  9. </div>
  10. <script src="vue.js"></script>
  11. <script>
  12. // 全局过滤器:Vue.filter(过滤器, callback)
  13. // Vue.filter('toDollar', (val) => '$' + val);
  14. // Vue.filter('toRMB', (val) => val * 6.85344567);
  15. // Vue.filter('toFixed', val => '¥' + val.toFixed(2));
  16. let vm = new Vue({
  17. el: '#app',
  18. data: {
  19. products: [
  20. {
  21. name: 'Mac',
  22. price: 2000
  23. },
  24. {
  25. name: 'iphoneX',
  26. price: 1000
  27. }
  28. ]
  29. },
  30. filters: { // 写在 filters 里面的过滤器是局部过滤器
  31. // toDollar: function (val) {},
  32. toDollar (val) {
  33. return'$' + val
  34. },
  35. toRMB(val) {
  36. return val * 6.85344567
  37. },
  38. toFixed(val, num = 2) {
  39. return '¥' + val.toFixed(num);
  40. }
  41. }
  42. })
  43. </script>

5. radio 和 v-model

多个 radio v-model 同一个属性,这些 radio 就是一组,每次只能有一个选中,v-model 的值是被选中的 radio 的 value

  1. <div id="app">
  2. 性别:
  3. <label>男:<input type="radio" v-model="sex" value="1"></label>
  4. <label>女:<input type="radio" v-model="sex" value="2"></label>
  5. <label>未知:<input type="radio" v-model="sex" value="3"></label>
  6. <br>
  7. {{sex}}
  8. </div>
  9. <script src="vue.js"></script>
  10. <script>
  11. let vm = new Vue({
  12. el: '#app',
  13. data: {
  14. sex: 3
  15. }
  16. })
  17. </script>

6. checkbox

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9. <div>
  10. <!--当 checkbox 只有一个的时候,vue 会把 val 默认转成布尔值,如果转完之后是 true,checkbox 就是选中状态,否则不选中-->
  11. <!--当 checkbox 选中状态发生变化的时候会触发 onchange 事件;-->
  12. 爱好:<label>吃饭:<input type="checkbox"
  13. v-model="val"
  14. @change="fn"
  15. value="1"></label>
  16. </div>
  17. {{val}}
  18. <div>
  19. <!--多个 checkbox 要 v-model 一个数组,当选中某一个 checkbox,这个 checkbox 的 value 会进到数组中,如果你取消某一个 checkbox,这个 checkbox 的 value 会自动从数组中移除掉-->
  20. 爱好:
  21. <label>
  22. <input type="checkbox"
  23. v-model="hobby"
  24. @change="checkChange"
  25. value="1">
  26. </label>
  27. <label>
  28. <input type="checkbox" v-model="hobby" value="2" @change="checkChange">
  29. </label>
  30. <label>
  31. RAP
  32. <input type="checkbox" v-model="hobby" value="3" @change="checkChange">
  33. </label>
  34. <label>
  35. 篮球
  36. <input type="checkbox" v-model="hobby" value="4" @change="checkChange">
  37. </label>
  38. </div>
  39. {{hobby}}
  40. </div>
  41. <script src="vue.js"></script>
  42. <script>
  43. let vm = new Vue({
  44. el: '#app',
  45. data: {
  46. val: 1,
  47. hobby: ['3', '4']
  48. },
  49. methods: {
  50. fn() {
  51. console.log(this.val);
  52. },
  53. checkChange() {
  54. console.log(this.hobby);
  55. }
  56. }
  57. })
  58. </script>
  59. </body>
  60. </html>

7. 下拉列表

select 下面的 option 都有一个 value 属性,select v-model 的值和 option 的 value 相同的时候,option 会被选中;当 option 切换的时候会触发 select 的 onchange 事件

  1. <div id="app">
  2. <select v-model="lunch" @change="lunchChange">
  3. <option value="1">孟记粥铺</option>
  4. <option value="2">张亮麻辣烫</option>
  5. <option value="3">田老师</option>
  6. </select>
  7. {{lunch}}
  8. <br>
  9. <!--textarea 通过 v-model 和某个属性双向数据绑定-->
  10. <button @click="clear">清空</button>
  11. <button @click="bigText = ''">清空</button>
  12. <textarea v-model="bigText" cols="30" rows="10"></textarea>
  13. <p>{{bigText}}</p>
  14. </div>
  15. <script src="vue.js"></script>
  16. <script>
  17. let vm = new Vue({
  18. el: '#app',
  19. data: {
  20. lunch: 2,
  21. bigText: '这是一段超长文本'
  22. },
  23. methods: {
  24. lunchChange() {
  25. console.log(this.lunch);
  26. },
  27. clear() {
  28. this.bigText = '';
  29. }
  30. }
  31. })
  32. </script>

8. vue-axios

  1. <div id="app">
  2. <ul>
  3. <li v-for="(item, index) in result" :key="index">
  4. {{item.name}}
  5. <ul>
  6. <li v-for="(fruit, fIndex) in item.list"
  7. :key="fIndex">{{fruit}}</li>
  8. </ul>
  9. </li>
  10. </ul>
  11. </div>
  12. <script src="axios.js"></script>
  13. <script src="vue.js"></script>
  14. <script>
  15. let vm = new Vue({
  16. el: '#app',
  17. data: {
  18. result: []
  19. },
  20. filters: {},
  21. methods: {
  22. getData() {
  23. axios.get('list.json').then(({data}) => {
  24. // console.log(data);
  25. this.result = data; // 拿到服务端返回的数据后,直接修改result,然后 vue 就知道 result 发生了变更,vue 就会按照最新的值渲染页面;
  26. })
  27. }
  28. },
  29. created() {
  30. // created 是 Vue 生命周期的钩子函数;
  31. // Vue 里面绝大多数的 ajax 请求都是在这里发送的
  32. // 一般是把请求封装成一个方法放到 methods 里面,然后在 created 里面调用;
  33. this.getData(); // 要通过 this 访问 methods 里面的方法
  34. }
  35. })
  36. </script>

9. 使用 bootstrap

bootstrap 是 css 框架,依靠类名来控制元素的样式;bootstrap 内置了很多样式,都是有固定类名的,当你需要这个样式的时候,在元素上加一个类名就可以了;

  1. bootstrap 采用的栅格布局,会把屏幕的宽分为12份;
  2. 常用的类名:
    2.1 .container 会让元素水平居中
    2.2 .row 行,一行是12列
    2.3 .col-lg-x 大屏幕
    2.3 .col-md-x 中等屏幕
    2.4 .col-sm-x 小屏幕
    2.5 .col-xs-x 超小屏幕