Blogger Information
Blog 29
fans 1
comment 0
visits 14851
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
vue常用指令,修饰符,计算属性,侦听器等
风车
Original
623 people have browsed it

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');

生命周期

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

Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post