• 计算属性与侦听器


    计算属性的基本使用

    1. 使用Mastache语法拼接

      {{firstName+ " " + lastName}}

    2. 使用方法methods

      {{getFullName()}}

    3. 使用计算属性computed

      {{fullName}}

    例子中计算属性computed看起来和方法似乎一样,只是方法调用需要使用(),而计算属性不用,方法取名字一般是动词见名知义,而计算属性是属性是名词,但这只是基本使用。

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript" charset="utf-8">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <h2>您的firstname:{{firstName}}h2>
    11. <h2>您的lastname:{{lastName}}h2>
    12. <h2>您的fullname是从计算属性中得到:{{fullName}}h2>
    13. <h2>您的fullname是从方法中得到:{{getFullName()}}h2>
    14. div>
    15. <script>
    16. const vm = new Vue({
    17. el:'#app',
    18. data(){
    19. return {
    20. firstName:'zhang',
    21. lastName:'san'
    22. }
    23. },
    24. methods:{
    25. getFullName(){
    26. return this.firstName + this.lastName
    27. }
    28. },
    29. computed:{//计算属性 一定要有一个返回值 在页面中渲染时是不需要加小括号的
    30. fullName(){
    31. return this.firstName + this.lastName
    32. }
    33. }
    34. })
    35. script>
    36. body>
    37. html>

     

     

    计算属性的复杂使用

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript" charset="utf-8">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <h2>您的总价:{{totalPrice}}h2>
    11. div>
    12. <script>
    13. const vm = new Vue({
    14. el: '#app',
    15. data() {
    16. return {
    17. books: [{
    18. id: 110,
    19. name: "JavaScript从入门到入土",
    20. price: 119
    21. },
    22. {
    23. id: 111,
    24. name: "Java从入门到放弃",
    25. price: 80
    26. },
    27. {
    28. id: 112,
    29. name: "编码艺术",
    30. price: 99
    31. },
    32. {
    33. id: 113,
    34. name: "代码大全",
    35. price: 150
    36. },
    37. ]
    38. }
    39. },
    40. computed: {
    41. /* totalPrice() {
    42. let total = 0
    43. for (let i = 0; i < this.books.length; i++) {
    44. total += this.books[i].price
    45. }
    46. return total
    47. } */
    48. /* totalPrice() {
    49. let total = 0
    50. for (let index in this.books) {
    51. total += this.books[index].price
    52. }
    53. return total
    54. } */
    55. /* totalPrice() {
    56. let total = 0;
    57. for(let item of this.books){
    58. total += item.price
    59. }
    60. return total
    61. } */
    62. /* totalPrice() {
    63. let total = 0;
    64. this.books.forEach(item=>{
    65. total += item.price
    66. })
    67. return total
    68. } */
    69. /* map */
    70. /* totalPrice() {
    71. let total = 0;
    72. this.books.map(item=>{
    73. total += item.price
    74. })
    75. return total
    76. } */
    77. /* filter */
    78. /* totalPrice() {
    79. let total = 0;
    80. this.books.filter(item=>{
    81. total += item.price
    82. })
    83. return total
    84. } */
    85. /* reduce */
    86. /* totalPrice() {
    87. return this.books.reduce((total,item)=>{
    88. return total + item.price
    89. },0)
    90. } */
    91. /* totalPrice() {
    92. return this.books.reduce((total,item)=>total + item.price,0)
    93. } */
    94. /* some */
    95. totalPrice() {
    96. let total = 0;
    97. this.books.some(item=>{
    98. total += item.price
    99. })
    100. return total
    101. }
    102. }
    103. })
    104. script>
    105. body>
    106. html>

     

     

    计算属性中的getter和setter

    计算属性一般没有set方法,只读属性,只有get方法,但是上述中newValue就是新的值,也可以使用set方法设置值,但是一般不用

    通过这种方式,我们可以在改变计算属性值的同时也改变和计算属性相关联的属性值。

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript" charset="utf-8">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <input type="text" v-model="firstName"/>
    11. <input type="text" v-model="lastName"/>
    12. <input type="text" v-model="fullName"/>
    13. div>
    14. <script>
    15. const vm = new Vue({
    16. el: '#app',
    17. data() {
    18. return {
    19. firstName: 'zhang',
    20. lastName: 'san'
    21. }
    22. },
    23. computed: { //计算属性 一定要有一个返回值 在页面中渲染时是不需要加小括号的
    24. /* fullName(){
    25. return this.firstName + this.lastName
    26. } */
    27. fullName: {
    28. get: function() {
    29. return this.firstName +','+ this.lastName
    30. },
    31. set:function(val){
    32. var list = val.split(',')
    33. console.log(list);
    34. this.firstName = list[0]
    35. this.lastName = list[1]
    36. }
    37. }
    38. }
    39. })
    40. script>
    41. body>
    42. html>

     

     

    计算属性和methods的对比

    计算属性有缓存,在this.firstName + " " + this.lastName的属性不变的情况下,methods调用了四次,而计算属性才调用了一次,性能上计算属性明显比methods好。而且在改动firstName的情况下,计算属性只调用一次,methods依然要调用4次。

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript" charset="utf-8">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <h2>您的fullname是从计算属性中得到:{{fullName}}h2>
    11. <h2>您的fullname是从计算属性中得到:{{fullName}}h2>
    12. <h2>您的fullname是从计算属性中得到:{{fullName}}h2>
    13. <h2>您的fullname是从计算属性中得到:{{fullName}}h2>
    14. <h2>您的fullname是从方法中得到:{{getFullName()}}h2>
    15. <h2>您的fullname是从方法中得到:{{getFullName()}}h2>
    16. <h2>您的fullname是从方法中得到:{{getFullName()}}h2>
    17. <h2>您的fullname是从方法中得到:{{getFullName()}}h2>
    18. div>
    19. <script>
    20. const vm = new Vue({
    21. el:'#app',
    22. data(){
    23. return {
    24. firstName:'zhang',
    25. lastName:'san'
    26. }
    27. },
    28. methods:{
    29. getFullName(){
    30. console.log('这里调用了方法getFullName');
    31. return this.firstName + this.lastName
    32. }
    33. },
    34. computed:{//计算属性 一定要有一个返回值 在页面中渲染时是不需要加小括号的
    35. fullName(){
    36. console.log('这里调用了计算属性fullName');
    37. return this.firstName + this.lastName
    38. }
    39. }
    40. })
    41. /* 总结:计算属性的性能是优于方法的 因为计算属性是具有缓存特性的 */
    42. script>
    43. body>
    44. html>

     

     

    侦听器watch的用法1

    监听器中有两个参数 一个是newval新的值 一个是oldval是老值

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript" charset="utf-8">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <h3>{{firstName}}h3>
    11. div>
    12. <script>
    13. const vm = new Vue({
    14. el: '#app',
    15. data() {
    16. return {
    17. firstName: "zhang",
    18. lastName: "san",
    19. watchFullName: "zhangsan",
    20. age: 18,
    21. }
    22. },
    23. watch: {
    24. /* firstName(newval,oldval){
    25. //监听器中有两个参数 一个是newval新的值 一个是oldval是老值
    26. console.log(newval);
    27. console.log(oldval);
    28. } */
    29. firstName: "change"
    30. },
    31. methods: {
    32. change(newval, oldval) {
    33. console.log(newval);
    34. console.log(oldval);
    35. }
    36. }
    37. })
    38. script>
    39. body>
    40. html>

     

     

    侦听器watch的用法2

    handler方法就相当于普通侦听器触发的事件,从结果可以看到,组件初始化的时候,侦听器并没有handler方法 ,所以fullName是没有值的

    当修改以上代码,加上immediate: true,immediate:true代表watch里面声明了之后会立马执行handler里面的函数。执行相应的逻辑。组件初始化的时候,侦听器会立马(immediate)触发handler方法

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript" charset="utf-8">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <p>FullName: {{person.fullname}}p>
    11. <p>FirstName: <input type="text" v-model="person.firstname">p>
    12. div>
    13. <script>
    14. const vm = new Vue({
    15. el: '#app',
    16. data() {
    17. return {
    18. person: {
    19. firstname: 'Menghui',
    20. lastname: 'Jin',
    21. fullname: ''
    22. }
    23. }
    24. },
    25. watch: {
    26. /* fullname(newval,oldval){
    27. console.log(newval);
    28. console.log(oldval);
    29. } */
    30. /* person(newval,oldval){
    31. console.log(newval);
    32. console.log(oldval);
    33. } */
    34. person:{
    35. handler(n,o){
    36. console.log(n);
    37. console.log(o);
    38. this.person.fullname = n.firstname + this.person.lastname
    39. },
    40. immediate:true,//刷新即加载
    41. deep:true//深度监听0
    42. }
    43. }
    44. })
    45. script>
    46. body>
    47. html>

     

     

    侦听器watch的用法3

    当在输入框中输入数据时, 可以发现fullName的值并没有随之改变 这是因为vue无法检测到对象内部属性值的变化,比如person.firstname的变化

    所以此时 需要用到vue的深度监听(deep)

    此时加上代码 deep: true

    可以发现 每次输入框数据变化 fullname随之改变

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript" charset="utf-8">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <p>FullName: {{person.fullname}}p>
    11. <p>FirstName: <input type="text" v-model="person.firstname">p>
    12. div>
    13. <script>
    14. const vm = new Vue({
    15. el: '#app',
    16. data() {
    17. return {
    18. person: {
    19. firstname: 'Menghui',
    20. lastname: 'Jin',
    21. fullname: ''
    22. }
    23. }
    24. },
    25. computed:{
    26. person2(){
    27. return JSON.parse(JSON.stringify(this.person));//深拷贝
    28. }
    29. },
    30. watch: {
    31. person2:{
    32. handler(n,o){
    33. console.log(this.person);
    34. console.log(n.firstname);
    35. console.log(o.firstname);
    36. },
    37. deep:true//深度监听
    38. }
    39. }
    40. })
    41. script>
    42. body>
    43. html>

     

     

  • 相关阅读:
    Go语言实现分布式缓存(二) —— 单机并发缓存
    【一周安全资讯1118】北京高院发布《侵犯公民个人信息犯罪审判白皮书》;工银金融勒索案的事件响应服务商MoxFive是谁?
    初步探索GraalVM——云原生时代JVM黑科技
    前端线上图片生成马赛克
    【uni-app从入门到实战】环境搭建和配置学习
    Rust结构体的定义和实例化
    如何识别图片中的文字?三种方法轻松搞定
    C++程序dll崩溃如何定位分析?
    QT自定义空间之软键盘
    Vuex
  • 原文地址:https://blog.csdn.net/m0_59359854/article/details/126021707