博客列表 >在 vue 中使用条件渲染语句实现 todolist,以及 vue 中的计算属性和侦听器属性介绍

在 vue 中使用条件渲染语句实现 todolist,以及 vue 中的计算属性和侦听器属性介绍

祥子弟弟
祥子弟弟原创
2021年02月10日 15:15:49869浏览

一、vue 中的条件渲染

条件渲染指令v-ifv-show

v-if 指令: v-if 指令和原生 js 中的 if 语句的功能是一样的,作为条件约束,执行哪些功能。同样有作为单分支和多分支条件的语句。
v-show 指令: v-show 指令和 v-if 指令的功能差不多,区别最大的一点是使用 v-dom 的元素,在 dom 树加载完成之后就会存在,只是显示不显示的问题,而 v-if 语句则不一样,它是根据条件判断,然后再从 vue 中渲染到页面上。v-show 的用处是可以定时的显示一些准备好的东西。好处是比起 v-if 来说,v-show 是本来就存在的 dom 元素,页面不会进行多次的渲染刷新。

实例演示条件渲染

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>条件渲染:v-if,v-show</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <!-- 单分支结构 -->
  11. <p v-if="flag">{{msg}}</p>
  12. <button
  13. v-text="tips = flag ? '隐藏' : '显示'"
  14. @click="flag = !flag"
  15. ></button>
  16. </div>
  17. <script>
  18. // v-if:决定元素是否添加到页面上
  19. // v-show:元素是否显示出来(元素已经在dom结构中了)
  20. const vm = new Vue({
  21. el: ".app",
  22. data() {
  23. return {
  24. msg: "当flag为true的时候我会显示出来",
  25. flag: true,
  26. };
  27. },
  28. });
  29. </script>
  30. </body>
  31. </html>

上述示例演示的是一个简单的由 v-if 指令完成的单分支的条件渲染,默认设置的是 flag=true, 可以看到的是 vue 的挂载点中的<p v-if="flag">{{msg}}</p>,作用是判断 flag 的值,然后选择要不要进行渲染,底下的 button 中的点击事件,给了一个可以改变 flag 的操作。

效果如下

在 html 文档中的显示是这样的

点击之前 dom 结构

点击之后 dom 结构

可以清楚的看到页面中的 dom 变化,所以每一次的 v-if 渲染都是对页面的一次刷新。

使用 v-show 来对页面进行渲染

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>条件渲染:v-if,v-show</title>
  7. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <!-- v-show操作 -->
  12. <p v-show="status">提前祝大家新年快乐!</p>
  13. <!-- v-show操作的用处:可以定时的显示一些准备好的东西,比起v-if来说,v-show是本来就存在的dom元素,页面不会进行多次的渲染刷新 -->
  14. </div>
  15. <script>
  16. // v-if:决定元素是否添加到页面上
  17. // v-show:元素是否显示出来(元素已经在dom结构中了)
  18. const vm = new Vue({
  19. el: ".app",
  20. data() {
  21. return {
  22. status: false,
  23. };
  24. },
  25. });
  26. </script>
  27. </body>
  28. </html>

可以看到的是当前我设置的是 false 状态,所以在页面中是不显示的可以看下执行结果和 dom 结构

然后再将 status 置为 true 状态,vm.$data.status = true;

可以看到的是,v-show 是在 dom 元素创建之后就存在了,只是显示不显示的决定在你,你可以设置什么时候显示,这样在一些活动倒计时的情况中,就直接可以更换页面,而不显得突兀,也不需要页面刷新。

不过 v-if 的条件渲染功能更加强大,v-show 则是实时性更加的好。

使用条件渲染完成 todolist
todolist,就是一个简单的留言功能

使用 vue 实现时,可以使用很多的事件修饰符和按键修饰符,可以省很多事

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>todolist</title>
  7. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <input type="text" name="" @keyup.enter="show($event)" />
  12. <ul v-if="list.length">
  13. <li v-for="(item, index) in list" :key="index" v-text="item"></li>
  14. </ul>
  15. </div>
  16. <script>
  17. // vue实现
  18. const vm = new Vue({
  19. el: ".app",
  20. data() {
  21. return {
  22. list: [],
  23. };
  24. },
  25. methods: {
  26. show(ev) {
  27. // console.log(ev.target.value);
  28. if (ev.target.value.trim().length === 0) {
  29. alert("输入内容不能为空!");
  30. } else {
  31. this.list.unshift(ev.target.value);
  32. ev.target.value = null;
  33. }
  34. },
  35. },
  36. });
  37. // 原生实现
  38. // // 获取事件
  39. // const input = document.querySelector('input[type="text"]');
  40. // const ul = document.querySelector("ul");
  41. // // 为input添加事件
  42. // input.onkeyup = (ev) => {
  43. // // 查看键盘输入
  44. // // console.log(ev.key);
  45. // if (ev.key === "Enter") {
  46. // // 去掉输入字符串两端的空格,然后判断字符串长度是否为0
  47. // if (input.value.trim().length === 0) {
  48. // alert("内容不能为空!");
  49. // } else {
  50. // let str = `<li>${input.value}</li>`;
  51. // ul.insertAdjacentHTML("afterbegin", str);
  52. // input.value = null;
  53. // }
  54. // }
  55. // };
  56. </script>
  57. </body>
  58. </html>

在上边的示例中使用了按键修饰符.enter,将它添加在事件的后边,则等同于原生中的if (ev.key === "Enter")条件判断语句

二、计算属性和侦听器属性

计算属性使用 computed 声明,本质上就是访问器属性,最终会和 data 合并,所以不要和 data 中已有属性重名。

示例

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>计算属性</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div class="app">
  10. <p>
  11. 数量:<input type="number" v-model="num" style="width: 5em" min="0" />
  12. </p>
  13. <p>单价:{{price}} 元</p>
  14. <p>金额:{{amount}} 元</p>
  15. </div>
  16. <script>
  17. const vm = new Vue({
  18. el: ".app",
  19. data() {
  20. return {
  21. num: 0,
  22. price: 50,
  23. res: 0,
  24. };
  25. },
  26. // 计算属性,使用computed声明
  27. computed: {
  28. // amount() {
  29. // return this.num * this.price;
  30. // },
  31. // 访问器属性有getter和setter
  32. // 计算属性默认是getter
  33. amount: {
  34. get() {
  35. return this.num * this.price;
  36. },
  37. set(value) {
  38. console.log(value);
  39. },
  40. },
  41. },
  42. });
  43. vm.amount = 1100;
  44. </script>
  45. </body>
  46. </html>

侦听器属性使用 watch 声明,它侦听的是某一个属性的值的变化,它的属性名与 data 中要监听的属性同名。侦听器属性更加注重的是实时性,但是它没有计算属性灵活.

比如还是上边计算属性的例子,使用侦听器属性实现

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>计算属性</title>
  7. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <!-- <p>
  12. 数量:
  13. <input
  14. type="number"
  15. v-model="num"
  16. style="width: 5em"
  17. min="0"
  18. @change="calc"
  19. />
  20. </p>
  21. <p>单价:{{price}} 元</p>
  22. <p>金额:{{res}} 元</p> -->
  23. <p>
  24. 数量:<input type="number" v-model="num" style="width: 5em" min="0" />
  25. </p>
  26. <p>单价:{{price}} 元</p>
  27. <!-- 计算属性,本质上就是访问器属性 -->
  28. <p>金额:{{res}} 元</p>
  29. </div>
  30. <script>
  31. const vm = new Vue({
  32. el: ".app",
  33. data() {
  34. return {
  35. num: 0,
  36. price: 50,
  37. res: 0,
  38. };
  39. },
  40. // 侦听器属性,使用watch声明
  41. watch: {
  42. // 侦听num属性的变化,num中的参数分别是变化的值,变化前的值
  43. num(newValue, oldValue) {
  44. // console.log(newValue, oldValue);
  45. this.res = newValue * this.price;
  46. },
  47. },
  48. });
  49. </script>
  50. </body>
  51. </html>

使用侦听器也同样可以完成相同的功能

计算属性是重新生成一个属性,相当于原生 js 中的访问器属性,只是访问和修改是和属性一样的方式,本质上还是一个方法。对于任何复杂逻辑,都应当使用计算属性去声明。侦听器属性的目的是观察和响应 Vue 实例上的数据变动,当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

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