博客列表 >PartIII 08 vue中的组件及传参(0909wed)

PartIII 08 vue中的组件及传参(0909wed)

老黑
老黑原创
2020年09月12日 22:09:19915浏览

主要内容:vue中的组件及传参

  1. 事件类型-通过@click=来绑定对应的方法
  2. 注册组件(全局组件及局部组件)
  3. 通过template来进行模块优化
  4. 传参方法
    • 使用自定义属性向组件传参
    • 使用data()向组件传参
    • 混合传参
  5. 传参方向
    • 父组件向子组件传参
    • 子组件验证从父组件接收的参数
    • 子组件向父组件传递消息($emit)

1. 事件类型

  • 通过@click=来绑定对应的方法
  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>事件</title>
  7. <script src="../lib/vue.js"></script>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <!-- v-on:事件类型 -->
  12. <p>
  13. <!-- <button v-on:click="num++">点赞</button>已被点赞<span style="color:red"> {{num}} </span> 次</span> -->
  14. <button @click="num++">点赞</button>已被点赞<span style="color:red"> {{num}} </span></span>
  15. </p>
  16. <p>
  17. <button @click="liked">点赞</button>已被点赞<span style="color:red"> {{num}} </span></span>
  18. </p>
  19. <p>
  20. <button @click="whoami('朱老师')">我是谁? </button><span>{{name}}</span>
  21. </p>
  22. <!-- 如果要访问原生的事件对象Event, 第一使用固定的参数名$event, 而且必须是最后一个参数(多个参数时) -->
  23. <ul @click="show($event)">
  24. <li v-for="item of animal">{{item}}</li>
  25. </ul>
  26. </div>
  27. <script>
  28. const vm = new Vue({
  29. el: ".app",
  30. data: {
  31. num: 3456,
  32. name:null,
  33. animal: ['小猪', '小狗', '小猫'],
  34. },
  35. //事件方法
  36. methods: {
  37. liked() {
  38. this.num++;
  39. },
  40. whoami(name){
  41. this.name = name;
  42. },
  43. show(event) {
  44. // 这个地方传参event不用加$,但前面的时候需要加。
  45. // console.log(event.target);
  46. // console.log(event.currentTarget);
  47. alert(`您喜欢的小动物是: ${event.target.innerHTML}`);
  48. }
  49. },
  50. });
  51. </script>
  52. </body>
  53. </html>

2. 注册组件

  • 全局组件:在所有的vue实例中都可以用
  • 局部组件:只限于在当前实例中使用
  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. <script src="../lib/vue.js"></script>
  7. <title>注册组件</title>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <!-- 加载到页面中的挂载点中 -->
  12. <global-component></global-component>
  13. <!-- 局部组件 -->
  14. <local-component1></local-component1>
  15. <local-component2></local-component2>
  16. </div>
  17. <hr />
  18. <div class="app2">
  19. <!-- 加载到页面中的挂载点中 -->
  20. <global-component></global-component>
  21. <!-- <local-component1></local-component1> -->
  22. </div>
  23. <script>
  24. // 1. 全局组件:在所有的vue实例中都可以用
  25. // Vue.component(组件标签, 组件的模板内容)
  26. Vue.component("global-component", {
  27. // template: 用户自定义的组件模板的内容
  28. template: "<p>我是一个全局组件</p>",
  29. });
  30. const vm = new Vue({
  31. el: ".app",
  32. // 局部组件: 只限于在当前实例中使用
  33. components: {
  34. "local-component1": {
  35. template: "<p>我是一个局部组件1</p>",
  36. },
  37. "local-component2": {
  38. template: "<p>我是一个局部组件2</p>",
  39. },
  40. },
  41. });
  42. const vm2 = new Vue({
  43. el: ".app2",
  44. });
  45. </script>
  46. </body>
  47. </html>


3. 组件模块的优化

  • 通过<template></template>中的 id 在vue.component中进行对应绑定
  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. <script src="../lib/vue.js"></script>
  7. <title>组件模板的优化</title>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <global-component></global-component>
  12. <local-component></local-component>
  13. </div>
  14. <!-- <script type="x-template" id="g-com1">
  15. <div class="cart">
  16. <h3>购物车</h3>
  17. <ul>
  18. <li>汽车</li>
  19. <li>裤子</li>
  20. <li>苹果</li>
  21. </ul>
  22. </div>
  23. </script> -->
  24. <template id="g-com1">
  25. <div class="cart">
  26. <h3>购物车</h3>
  27. <ul>
  28. <li>火车</li>
  29. <li>裤子</li>
  30. <li>苹果</li>
  31. </ul>
  32. </div>
  33. </template>
  34. <!-- 局部组件 -->
  35. <template id="l-com1">
  36. <p>Hello 我是局部组件对应的模板内容</p>
  37. </template>
  38. <script>
  39. // 全局组件
  40. Vue.component("global-component", {
  41. // template: `
  42. // <div class="cart">
  43. // <h3>购物车</h3>
  44. // <ul>
  45. // <li>汽车</li>
  46. // <li>裤子</li>
  47. // <li>苹果</li>
  48. // </ul>
  49. // </div>
  50. // `,
  51. // 这里要有一个标识和上面的script type="x-template"进行绑定
  52. template: "#g-com1",
  53. });
  54. const vm = new Vue({
  55. el: ".app",
  56. // 局部组件
  57. components: {
  58. "local-component": {
  59. template: "#l-com1",
  60. },
  61. },
  62. });
  63. </script>
  64. </body>
  65. </html>

4. 使用自定义属性向组件传参

  • <template></template>来设置
  • 通过id在vue.component中进行绑定
  • 并通过props: [‘’, ‘’, ‘’]来传参数
  • 最后在dom中通过具体变量名来渲染
  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>使用自定义属性向组件传参</title>
  7. <script src="../lib/vue.js"></script>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <!-- 通过属性向组件传参 -->
  12. <my-component id="1" name="peter" email="peter@php.cn"></my-component>
  13. </div>
  14. <template id="user">
  15. <ul>
  16. <li>ID: {{id}}</li>
  17. <li>姓名: {{name}}</li>
  18. <li>邮箱: {{email}}</li>
  19. </ul>
  20. </template>
  21. <script>
  22. // 注册组件
  23. Vue.component("my-component", {
  24. template: "#user",
  25. // 在组件中使用props属性来接收通过组件标签的属性传递过来的参数
  26. props: ["id", "name", "email"],
  27. });
  28. const vm = new Vue({
  29. el: ".app",
  30. });
  31. </script>
  32. </body>
  33. </html>

5. 使用data()向组件传参

  • 与前面不同的是props为空[]
  • 增加了一个data()function,在其中返回具体的赋值,并且将data:{}在vue实例中体现
  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>使用data()向组件传参</title>
  7. <script src="../lib/vue.js"></script>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <!-- 通过属性向组件传参 -->
  12. <my-component></my-component>
  13. </div>
  14. <template id="user">
  15. <ul>
  16. <li>ID: {{id}}</li>
  17. <li>姓名: {{name}}</li>
  18. <li>邮箱: {{email}}</li>
  19. </ul>
  20. </template>
  21. <script>
  22. // 注册组件
  23. Vue.component("my-component", {
  24. template: "#user",
  25. // 在组件中使用props属性来接收通过组件标签的属性传递过来的参数
  26. props: [],
  27. data() {
  28. return {
  29. id: 2,
  30. name: "朱老师",
  31. email: "peter@php.cn",
  32. };
  33. },
  34. });
  35. const vm = new Vue({
  36. el: ".app",
  37. data: {},
  38. });
  39. </script>
  40. </body>
  41. </html>

6. 使用data()和属性向组件传参

  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>使用data()和属性向组件传参</title>
  7. <script src="../lib/vue.js"></script>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <!-- 通过属性向组件传参 -->
  12. <my-component blog="https://php.cn/hello.html"></my-component>
  13. </div>
  14. <template id="user">
  15. <ul>
  16. <li>ID: {{id}}</li>
  17. <li>姓名: {{name}}</li>
  18. <li>邮箱: {{email}}</li>
  19. <!-- <li>博客:<a v-bind:href="blog">{{blog}}</a></li> ,下面为简化,去掉了v-bind-->
  20. <li>博客:<a :href="blog">{{blog}}</a></li>
  21. </ul>
  22. </template>
  23. <script>
  24. // 注册组件
  25. Vue.component("my-component", {
  26. template: "#user",
  27. // 自定义属性与data()方法共同向组件传参
  28. props: ["blog"],
  29. data() {
  30. return {
  31. id: 2,
  32. name: "朱老师",
  33. email: "peter@php.cn",
  34. };
  35. },
  36. });
  37. const vm = new Vue({
  38. el: ".app",
  39. data: {},
  40. });
  41. </script>
  42. </body>
  43. </html>

7. 父组件向子组件传参

  • 在vue实例中通过data:{user:{}}对象来赋值
  • 通过<template></template>,vue.component来创建子组建并绑定
  • 跟上面在vue.component中的data()function来赋值还是不同的。
  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>父组件向子组件传参</title>
  7. <script src="../lib/vue.js"></script>
  8. </head>
  9. <body>
  10. <!-- 父组件:唯一的 -->
  11. <div class="app">
  12. <!-- 子组件: 可以有多个,可以由全局组件或局部组件充当 -->
  13. <!-- 用自定义属性来实现父组件向子组件传参 -->
  14. <my-component :user="user"></my-component>
  15. </div>
  16. <template id="user">
  17. <ul>
  18. <li>ID: {{user.id}}</li>
  19. <li>姓名: {{user.name}}</li>
  20. <li>邮箱: {{user.email}}</li>
  21. </ul>
  22. </template>
  23. <script>
  24. // 注册: 全局组件
  25. Vue.component("my-component", {
  26. template: "#user",
  27. // 子组件中接收一个父组件传递过来的user对象
  28. props: ["user"], // 这个地方也需要有
  29. });
  30. const vm = new Vue({
  31. el: ".app",
  32. data: {
  33. user: {
  34. id: 3,
  35. name: "王文军",
  36. email: "wwj@php.cn",
  37. },
  38. },
  39. });
  40. </script>
  41. </body>
  42. </html>

8. 子组件验证从父组件接收的参数

  • 也就是在props:[]中进行一些基本的限定,例如类型,如果不对就返回false
  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>子组件验证从父组件接收的参数</title>
  7. <script src="../lib/vue.js"></script>
  8. </head>
  9. <body>
  10. <!-- 父组件:唯一的 -->
  11. <div class="app">
  12. <!-- 子组件: 可以有多个,可以由全局组件或局部组件充当 -->
  13. <!-- 用自定义属性来实现父组件向子组件传参 -->
  14. <my-component :user="user" :blog="blog"></my-component>
  15. </div>
  16. <template id="user">
  17. <ul>
  18. <li>ID: {{user.id}}</li>
  19. <li>姓名: {{user.name}}</li>
  20. <li>邮箱: {{user.email}}</li>
  21. <li>博客: <a :href="blog">{{blog}}</a></li>
  22. </ul>
  23. </template>
  24. <script>
  25. // 注册: 全局组件
  26. Vue.component("my-component", {
  27. template: "#user",
  28. // 下面这个地方就相当于在做验证,跟前面就有区别了。
  29. props: {
  30. user: Object,
  31. blog: {
  32. type: String,
  33. default: "https://www.php.cn/default.html",
  34. },
  35. },
  36. });
  37. const vm = new Vue({
  38. el: ".app",
  39. data: {
  40. user: {
  41. id: 3,
  42. name: "王文军",
  43. email: "wwj@php.cn",
  44. },
  45. blog: "https://www.php.cn/hello.html",
  46. },
  47. });
  48. </script>
  49. </body>
  50. </html>

9. 子组件向父组件传递消息

  • 子组件向父组件传递消息(全是通过事件,呼叫父组件来响应 $emit)
  • 仍是通过自定义属性进行交互
  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>子组件向父组件传递消息</title>
  7. <script src="../lib/vue.js"></script>
  8. </head>
  9. <body>
  10. <div class="app">
  11. <my-component
  12. :product="product"
  13. @count="total"
  14. <!-- count是一个方法,而非一个属性,因此绑定用@,而非:冒号 -->
  15. <!-- total是一个表达式,然后下一面一行中的total再和父组件中的方法进行绑定-->
  16. :total="total"
  17. ></my-component>
  18. <span style="float: right; margin-right: 50px;"
  19. >总计: {{totalPrice}} 元</span
  20. >
  21. </div>
  22. <template id="cart">
  23. <table
  24. border="1"
  25. width="80%"
  26. align="center"
  27. cellspacing="0"
  28. cellpadding="5"
  29. >
  30. <caption>
  31. 购物车
  32. </caption>
  33. <tr bgcolor="lightblue">
  34. <th>ID</th>
  35. <th>品名</th>
  36. <th>单价</th>
  37. <th>数量</th>
  38. </tr>
  39. <tr v-for="item of product"> //这个地方用of或in都可以
  40. <td>{{item.id}}</td>
  41. <td>{{item.name}}</td>
  42. <td>{{item.price}}</td>
  43. <td><input type="number" v-model="item.num" @change="count" /></td>
  44. <!-- 这块主要是为了可以修改 -->
  45. </tr>
  46. </table>
  47. </template>
  48. <script>
  49. Vue.component("my-component", {
  50. template: "#cart",
  51. props: ["product"],
  52. methods: {
  53. count() {
  54. // 向父组件发送消息,调用父组件的total()
  55. this.$emit("count");
  56. },
  57. },
  58. });
  59. const vm = new Vue({
  60. el: ".app",
  61. data: {
  62. product: [
  63. { id: 1, name: "电脑", price: 5000, num: 1 },
  64. { id: 2, name: "手机", price: 3000, num: 1 },
  65. ],
  66. totalPrice: 0,
  67. },
  68. mounted() {
  69. this.total();
  70. },
  71. methods: {
  72. total() {
  73. this.totalPrice = 0;
  74. this.forEach((item) => {
  75. this.totalPrice += item.num * item.price;
  76. });
  77. },
  78. },
  79. });
  80. // 子组件向父组件传递消息(全是通过事件,呼叫父组件来响应)
  81. // 仍是通过自定义属性进行交互
  82. </script>
  83. </body>
  84. </html>

" class="reference-link">

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