博客列表 >vue常用指令,修饰符,计算属性,侦听器等

vue常用指令,修饰符,计算属性,侦听器等

风车
风车原创
2022年08月13日 17:26:30619浏览

vue中的事件绑定

首先写一端Html,添加一些事件

  1. <div class="app">
  2. <p onclick="console.log('hello world')">
  3. <!-- 事件属性 -->
  4. <!-- .prevent.stop: 事件修饰符, prevent禁用默认行为,stop: 防止冒泡 -->
  5. <a href="https://www.php.cn" @click.prevent.stop="showUrl($event)">show URL(Vue) : </a>
  6. <span class="url">{{url}}</span>
  7. </p>
  8. </div>

vue代码
methods 当前属性中的事件对象

  1. <script>
  2. Vue.createApp({
  3. // 实例数据
  4. data() {
  5. return {
  6. // 插值变量
  7. url: null,
  8. };
  9. },
  10. // 事件方法
  11. methods: {
  12. showUrl(ev) {
  13. // 禁用默认行为
  14. // ev.preventDefault();
  15. // 防止事件冒泡
  16. // ev.stopPropagation();
  17. // 上面两个禁用可以使用这个语法直接一步达成(写在html代码中).prevent.stop: 事件修饰符, prevent禁用默认行为,stop: 防止冒泡
  18. this.url = ev.currentTarget.href;
  19. },
  20. },
  21. }).mount('.app');
  22. </script>

列表渲染

首先有一组vue数据

  1. <script>
  2. const app = Vue.createApp({
  3. data() {
  4. return {
  5. // array
  6. cities: ['合肥', '苏州', '南京'],
  7. // object: 关联数组
  8. user: {
  9. name: '猪老师',
  10. email: 'laozhu@php.cn',
  11. },
  12. // array of object
  13. users: [
  14. {
  15. name: '猪老师',
  16. email: 'laozhu@php.cn',
  17. },
  18. {
  19. name: '灭绝老师',
  20. email: 'miejue@php.cn',
  21. },
  22. {
  23. name: '欧阳老师',
  24. email: 'ouyang@php.cn',
  25. },
  26. ],
  27. };
  28. },
  29. }).mount('.app');
  30. </script>

列表渲染就是将类或者对象,在页面中渲染出来
1.通过列表的方式,在列表中直接调用模板字面量,接收数据(如果在后面通过指定健名的方式,可以调用数组中的某一个指定数据)

  1. <div class="app">
  2. <!-- array -->
  3. <ul>
  4. <li>{{cities[0]}}</li>
  5. <li>{{cities[1]}}</li>
  6. <li>{{cities[2]}}</li>
  7. </ul>
  8. </div>

2.V-for循环输出
V-for也会接收两个值,就是当前遍历的值和对应的健名,就比如我们下方代码用city和index来接收

  1. <ul>
  2. <!-- <li v-for="city of cities">{{city}}</li> -->
  3. <li v-for="(city,index) of cities" :key="index">{{index}} : {{city}}</li>
  4. </ul>

3.V-for 输出对象数组

  1. <!-- v-for: 对象数组 -->
  2. <ul>
  3. <li v-for="(user,index) of users" :key="index">{{user.name}} : ({{user.email}})</li>
  4. </ul>

条件渲染

首先创建一个vue数据

  1. Vue.createApp({
  2. data() {
  3. return {
  4. message: '今天是前端最后一课',
  5. flag: true,
  6. // 会员级别
  7. grade: ['纸片会员', '木头会员', '铁皮会员', '金牌会员', '非会员'],
  8. // 积分
  9. point: 3500,
  10. };
  11. },
  12. }).mount('.app');

然后我们需要在页面中有条件的显示数据内容,可以通过v-if
v-if
注释:
1.首先如果flag为真 显示模板字面量关联的数据
2.给按钮一个vue(Vue事件前缀用@)点击事件,点击之后改变当前按钮状态(我们在上方代码中定义了flag为真 !flag就是取反的意思,flag=!flag 的意思就是切换当前状态 如果为真点击后变为假,如果为假点击后变为真)然后判断当前状态来改变显示在按钮上的文字
3.这是一个单分支操作

  1. <div class="app">
  2. <p v-if="flag">{{message}}</p>
  3. <button @click="flag=!flag" v-text="flag ? '隐藏' : '显示'"></button>

注释:
这个和之前的if多分支一样,一级一级的判断
只是将语法变成了 v-if v-if-eles v-eles

  1. <!-- if-else, if else if else -->
  2. <p v-if="point>=1000 && point< 2000">{{grade[0]}}</p>
  3. <p v-else-if="point>=2000 && point< 3000">{{grade[1]}}</p>
  4. <p v-else-if="point>=3000 && point< 4000">{{grade[2]}}</p>
  5. <p v-if="point>=4000">{{grade[3]}}</p>
  6. <!-- <p v-else>{{grade[4]}}</p> -->
  7. </div>

利用vue重写之前的留言板案例

  1. <div class="liuyan">
  2. <!-- enter: 键盘修饰符, 代表回车 -->
  3. <!-- 创建一个输入框,并定义一个vue事件-->
  4. <input type="text" @keydown.enter="submit($event)" />
  5. <ul>
  6. <li v-for="(item,index) of list" :key="index">{{item}}</li>
  7. </ul>
  8. </div>
  9. <script>
  10. Vue.createApp({
  11. data() {
  12. return {
  13. // 留言列表
  14. list: [],
  15. };
  16. },
  17. //为上方定义的时间创建一个方法
  18. methods: {
  19. submit(ev) {
  20. //如果上方代码中没有使用键盘修饰符,去监听按下的键,那就用下面在这个方法,来判定用户是不是按下了回车键
  21. // console.log(ev);
  22. // if (ev.key === 'Enter') {
  23. // this.list.unshift(ev.currentTarget.value);
  24. // ev.currentTarget.value = null;
  25. // }
  26. this.list.unshift(ev.currentTarget.value);
  27. ev.currentTarget.value = null;
  28. },
  29. },
  30. }).mount('.liuyan');
  31. </script>

计算属性和侦听器属性

计算器属性:computed
侦听器属性: watch 被侦听的属性,其实是一个方法,它有二个参数第一个参数是新值(当前值),第二个参数是原值(旧值)

先写一个商品结算页面

  1. <style>
  2. table {
  3. width: 20em;
  4. height: 10em;
  5. text-align: center;
  6. border-collapse: collapse;
  7. margin: 1em;
  8. }
  9. table caption {
  10. font-size: 1.2em;
  11. padding: 1em;
  12. margin-bottom: 2em;
  13. border-bottom: 1px solid;
  14. }
  15. tbody tr th:first-of-type {
  16. background: linear-gradient(to left, lightcyan, #fff);
  17. border-right: 1px solid;
  18. }
  19. body tbody tr:not(:last-of-type) > * {
  20. border-bottom: 1px solid;
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <div class="app">
  26. <table>
  27. <caption>
  28. 商品结算
  29. </caption>
  30. <tbody>
  31. <tr>
  32. <th>ID</th>
  33. <td>HA110</td>
  34. </tr>
  35. <tr>
  36. <th>品名</th>
  37. <td>伊利纯牛奶</td>
  38. </tr>
  39. <tr>
  40. <th>单价</th>
  41. <td>100</td>
  42. </tr>
  43. <tr>
  44. <th>数量</th>
  45. <td><input type="number" v-model="num" style="width: 5em" /></td>
  46. </tr>
  47. <tr>
  48. <th>金额</th>
  49. <!-- <td>{{num * price}}</td> -->
  50. <td>{{amount}}</td>
  51. </tr>
  52. </tbody>
  53. </table>
  54. <p style="font-size: 1.2em">
  55. 实付金额: {{realAmount}}, 优惠了 :
  56. <span style="color: red">{{difAmount}}</span>
  57. </p>
  58. </div>

然后下面是vue代码

  1. <script>
  2. const app = Vue.createApp({
  3. data() {
  4. return {
  5. // 单价
  6. price: 100,
  7. // 数量
  8. num: 0,
  9. // 折扣
  10. discount: 1,
  11. };
  12. },
  13. // 计算属性(访问器属性)
  14. computed: {
  15. // 计算属性金额 = 单价 * 数量
  16. amount: {
  17. get() {
  18. return this.price * this.num;
  19. },
  20. set(value) {
  21. //...
  22. },
  23. },
  24. },
  25. // 侦听器属性
  26. watch: {
  27. // 访问器属性
  28. // 被侦听的属性,其实是一个方法,它有二个参数
  29. // 第一个参数是新值(当前值),第二个参数是原值(旧值)
  30. amount(current, origin) {
  31. console.log(current, origin);
  32. // 根据当前金额确定打折
  33. switch (true) {
  34. // 1000-2000: 9折
  35. case current >= 1000 && current < 2000:
  36. this.discount = 0.9;
  37. break;
  38. // 2000 -> 3000 : 8折
  39. case current >= 2000 && current < 3000:
  40. this.discount = 0.8;
  41. break;
  42. // 3000 -> 4000 : 7折
  43. case current >= 3000 && current < 4000:
  44. this.discount = 0.7;
  45. break;
  46. // 4000 -> 5000 : 6折
  47. case current >= 4000 && current < 5000:
  48. this.discount = 0.6;
  49. break;
  50. // 5000 : 5折
  51. case current >= 5000:
  52. this.discount = 0.5;
  53. }
  54. // 实付金额 = 原始金额 * 折扣率
  55. this.realAmount = this.amount * this.discount;
  56. // 优惠金额(差价) = 原始金额 - 实付金额
  57. this.difAmount = this.amount - this.realAmount;
  58. },
  59. },
  60. // 实例生命周期: 当实例与挂载点绑定成功时,自动执行
  61. mounted() {
  62. //初始化商品数量,默认为1
  63. this.num = 1;
  64. },
  65. }).mount('.app');

生命周期

上面的案例中出现了一个属性,叫生命周期
实例生命周期: 当实例与挂载点绑定成功时,自动执行

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议