16_vue组件传参子给父.html 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <style>
  8. .box{
  9. display: flex;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <div id="app">
  15. <div class="box">
  16. <!-- 父组件接受子组件传递过来的通知 -->
  17. <!-- 通过自定义事件的方式 -->
  18. <!-- html中不识别驼峰命名 所以在子组件中触发事件时 要使用短横线命名 -->
  19. <box v-bind:val="i" v-on:child-change="changeFun"></box>
  20. <h1>+</h1>
  21. <box v-bind:val="j"></box>
  22. <div><h1>=</h1></div>
  23. <div><h1>{{i+j}}</h1></div>
  24. </div>
  25. </div>
  26. <template id="box-temp">
  27. <div>
  28. <h1 @click="addFun">{{num2}}</h1>
  29. </div>
  30. </template>
  31. <script src="./js/vue.js"></script>
  32. <script>
  33. new Vue({
  34. el: '#app',
  35. data:{
  36. i:10,
  37. j:20
  38. },
  39. methods:{
  40. // 父组件中定义的方法 用来接受子组件传递过来的通知
  41. changeFun(a,b){
  42. console.log("子组件通知父组件了",a,b);
  43. }
  44. },
  45. components:{
  46. "box":{
  47. template:"#box-temp",
  48. data(){
  49. return{
  50. // 子组件中可以使用props接受父组件传参
  51. // 为了避免直接修改props中的值 所以在data中重新定义一个属性接受props中的值
  52. num2:this.val
  53. }
  54. },
  55. // 组件传参 子组件接收父组件传参通过props属性的方式
  56. // 可以接受多个参数所以用数组的方式
  57. // props 接受的值不可以在子组件中修改
  58. props:["val"],
  59. methods:{
  60. addFun(){
  61. this.num2++;
  62. // 子组件通知父组件
  63. // 子组件中可以使用$emit方法触发一个自定义事件
  64. // 会传递多个参数第一个参数是事件名 后面的参数是要传递的参数
  65. this.$emit("child-change",this.num2,this.val);
  66. }
  67. }
  68. }
  69. }
  70. })
  71. </script>
  72. </body>
  73. </html>