欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Vue自学:父子组件通信-父传子props

程序员文章站 2022-03-06 12:24:08
...
  1. `<!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
  8. <title>Vue自学:父子组件通信-父传子props</title>
  9. </head>
  10. <body>
  11. <div id="app">
  12. <!-- 分配通信过来的数值给到cpn子组件,分配方式为绑定虚拟属性 v-bind:arr="arr" -->
  13. <cpn v-bind:arr="arr"></cpn>
  14. </div>
  15. </body>
  16. <template id="cpn">
  17. <div>
  18. <ul>
  19. <!-- 成功的分配到了数值,通过分配过来的数值遍历 -->
  20. <li v-for="item in arr">{{item}}</li>
  21. </ul>
  22. </div>
  23. </template>
  24. <script type="text/javascript">
  25. //在上一节中,我们提到了子组件是不能引用父组件或者Vue实例的数据的
  26. //但是,在开发中,往往一些数据确实需要从上层传递到下层
  27. //比如在一个页面当中,我们从服务器请求到了很多数据
  28. //其中一部分数据,并非是我们整个页面的大组件来展示的,而是需要下面的子组件进行展示
  29. //这个时候,并不会让子组件再次发送一个网络请求,而是直接让大组件(父组件)传递数据给小组件(子组件)
  30. //如何进行父组件间的数据传递呢?Vue官方提到
  31. //通过props向子组件传递数据
  32. //通过事件向父组件传递信息
  33. //1.创建局部组件
  34. const cpn = {
  35. // 设置绑定的模板
  36. template:'#cpn',
  37. data(){
  38. },
  39. methods:{
  40. },
  41. //props:父组件传递到子组件的通信
  42. props:{
  43. //默认值写法(最为完善的写法)
  44. //传递过来的是父组件中的arr属性
  45. //推荐使用使用对象写法
  46. arr:{
  47. type:Array,
  48. //当默认值为空数组时,正确的是些是使用函数返回默认值
  49. default(){
  50. return []
  51. },
  52. required:true,
  53. },
  54. },
  55. //使用对象写法的同时,也可以使用数组写法 ['arr'],但无法进行数据验证,因而不推荐
  56. //使用对象写法,可以进行数据类型校验,验证支持如下类型:
  57. //String
  58. //Number
  59. //Boolean
  60. //Array
  61. //Object
  62. //Date
  63. //Function
  64. //Symbol
  65. }
  66. //2.创建父组件
  67. const app = new Vue({
  68. el:'#app',
  69. data:{
  70. arr:['苹果','香蕉','雪梨','蔬菜'],
  71. },
  72. methods:{
  73. },
  74. components:{
  75. 'cpn':cpn
  76. },
  77. })
  78. //使用对象的方式对类型进行返回或验证
  79. // Vue.component('my-component',{
  80. // props:{
  81. // //基础的类型检查('null,匹配任何类型'),匹配单个
  82. // propA:Number,
  83. // //匹配多个可能的类型,重叠
  84. // propB:[string,Number],
  85. // //必须的字符串
  86. // propC:{
  87. // type:String,
  88. // required:true,
  89. // },
  90. // //带有默认值为数字的
  91. // propD:{
  92. // type:Number,
  93. // default:100,
  94. // }
  95. // //带有默认值的对象
  96. // propE:{
  97. // type:Object,
  98. // //对象或数组,一定以函数方式返回
  99. // default(){
  100. // return {
  101. // name:'梁凯达'
  102. // }
  103. // }
  104. // },
  105. // //自定义验证函数
  106. // propF:{
  107. // validator:function(){
  108. // //这个值必须匹配下列字符串中的某一个
  109. // return ['success','warning','danger'].indexOf(value) !== -1
  110. // }
  111. // }
  112. // }
  113. // })
  114. </script>
  115. </html>`