1. 程式人生 > >vue中的元件傳值

vue中的元件傳值

父元件向子元件傳值

這是最開始的程式碼:

  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <title>Hello World</title>

  6. <script src="vue.js" type="text/javascript" charset="utf-8"></script>

  7. <script src="jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>

  8. </head>

  9. <body>

  10. <div id="app">

  11. <input type="" name="" v-model="inputvalue">

  12. <button type="" v-on:click="handleItemSubmit">提交</button>

  13. <ul>

  14. <todo-item v-for="item in list"

  15. v-bind:content="item">

  16. </todo-item>

  17. </ul>

  18. </div>

  19. <script>

  20. var TodoItem = {

  21. props : ["content"],

  22. template : "<li>{{content}}</li>"

  23. }

  24. var app = new Vue({

  25. el : "#app",

  26. data : {

  27. list : [],

  28. inputvalue : ""

  29. },

  30. components : {

  31. TodoItem : TodoItem

  32. },

  33. methods : {

  34. handleItemSubmit : function () {

  35. this.list.push(this.inputvalue);

  36. this.inputvalue = "";

  37. }

  38. }

  39. });

  40. </script>

  41. </body>

  42. </html>

父元件中data的資料,通過v-for和v-bind傳遞給了子元件

現在子元件向父元件傳值

  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4. <meta charset="UTF-8">

  5. <title>Hello World</title>

  6. <script src="vue.js" type="text/javascript" charset="utf-8"></script>

  7. <script src="jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>

  8. </head>

  9. <body>

  10. <div id="app">

  11. <input type="" name="" v-model="inputvalue">

  12. <button type="" v-on:click="handleItemSubmit">提交</button>

  13. <ul>

  14. <todo-item v-for="(item, index) in list"

  15. v-bind:content="item"

  16. v-bind:index="index"

  17. v-on:delete="handleItemDelete">

  18. </todo-item>

  19. </ul>

  20. </div>

  21. <script>

  22. var TodoItem = {

  23. props : ["content", "index"],

  24. template : "<li v-on:click='handleItemClick'>{{content}}</li>",

  25. methods : {

  26. handleItemClick : function () {

  27. this.$emit("delete", this.index);

  28. }

  29. }

  30. }

  31. var app = new Vue({

  32. el : "#app",

  33. data : {

  34. list : [],

  35. inputvalue : ""

  36. },

  37. components : {

  38. TodoItem : TodoItem

  39. },

  40. methods : {

  41. handleItemSubmit : function () {

  42. this.list.push(this.inputvalue);

  43. this.inputvalue = "";

  44. },

  45. handleItemDelete : function (index) {

  46. this.list.splice(index, 1);

  47. }

  48. }

  49. });

  50. </script>

  51. </body>

  52. </html>

要想要傳值給父元件,首先需要在子元件template模板中,加一個handleItemClick函式,再在子元件物件中的methods新增handleItemClick函式,呼叫this.$emit("delete", this.index),前面用來監聽父元件的函式,後面是傳遞給父元件函式的值

-------------------------------------------------------------------------------------------------------------------------

:count="1"

如果不加冒號,count裡面就是一個字串,而一旦加了冒號,就會被處理成表示式,就變成數字了

那麼,我現在想要實現一個點選數字,數字就能夠自己加1

如下:

點選之後是能夠加上的

但是Vue會返回一個警告,原因在於如果是父元件count變化了,然後再傳給子元件,那麼是沒有任何問題的,但是對於子元件來說,接受到父元件傳過來的內容,只能去使用它,卻不能改變它,就是一個單項資料流的意思,

之所以有這個單項資料流是因為如果父元件傳過來的是一個引用值,那麼其中一個子元件改變了其內容,如果有其他子元件也引用了這個資料,這就對其他子元件造成了影響

那麼我們現在這個功能怎麼實現呢?其實也簡單,只要將this.count儲存到自己得data中,然後對自己的data進行操作就可以了

這樣就能實現相加,而且控制檯不報錯

那麼現在實現將兩個數字相加

子元件通過emit事件觸發的形式,來向父元件傳值;

父元件通過屬性傳遞的方式,來向子元件傳值,但是子元件不能改變父元件傳遞過來的值,如果非要修改,就複製一個副本,再進行改變