概要

  1. 组件基础
  2. 组件传递数据

    一、组件基础

    1、创建组件

    2、组件的组成

  3. template:相当于组件结构(html)

    1. 必须有且仅有一个根元素
  4. script:相当于业务逻辑(js)
  5. style:相当于样式结构(css)

    1. scoped:css作用域,当前的样式只会在当前组件中生效

      3、组件的引用

      image.png

      4、组件的复用

      组件可以多次调用

      5、组件的组织

  6. 组件之间的调用是没有限制的

  7. 通常一个应用会以一颗嵌套的组件树的形式来组织

image.png

二、组件传递数据

1. 父传子:props

  1. <template>
  2. <div id="app">
  3. <img alt="Vue logo" src="./assets/logo.png" />
  4. <HelloWorld msg="Welcome to Your Vue.js App" />
  5. <!-- 3.使用组件 -->
  6. <Header :fatherInfo="fatherInfo"></Header>
  7. </div>
  8. </template>
  9. <script>
  10. import HelloWorld from "./components/HelloWorld.vue";
  11. import Header from "./components/header.vue"; // 1.引入组件
  12. export default {
  13. name: "App",
  14. components: {
  15. HelloWorld,
  16. Header, // 2.注册组件
  17. },
  18. data() {
  19. return {
  20. fatherInfo: "我是来自APP.vue的信息"
  21. };
  22. }
  23. };
  24. </script>
  25. <style>
  26. #app {
  27. font-family: Avenir, Helvetica, Arial, sans-serif;
  28. -webkit-font-smoothing: antialiased;
  29. -moz-osx-font-smoothing: grayscale;
  30. text-align: center;
  31. color: #2c3e50;
  32. margin-top: 60px;
  33. }
  34. </style>
  1. <template>
  2. <div>
  3. <button class="btn">
  4. 按钮 {{ fatherInfo }}
  5. </button>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. props: ["fatherInfo"]
  11. };
  12. </script>
  13. <style scoped>
  14. .btn {
  15. width: 300px;
  16. height: 300px;
  17. background-color: coral;
  18. }
  19. </style>

2. 子穿父:自定义事件

  1. <template>
  2. <div>
  3. <button class="btn" @mouseover="over" @mouseout="out">
  4. 按钮
  5. </button>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. data() {
  11. return {
  12. overInfo: "我进来了",
  13. outInfo: "我出去了",
  14. };
  15. },
  16. methods: {
  17. over() {
  18. // 父级在使用该组件的过程中,可以通过 @事件名称 来注册绑定事件函数
  19. this.$emit("onOver", this.overInfo);
  20. },
  21. out() {
  22. this.$emit("onOut", this.outInfo);
  23. },
  24. },
  25. };
  26. </script>
  27. <style scoped>
  28. .btn {
  29. width: 300px;
  30. height: 300px;
  31. background-color: coral;
  32. }
  33. </style>
  1. <template>
  2. <div id="app">
  3. <img alt="Vue logo" src="./assets/logo.png" />
  4. <HelloWorld msg="Welcome to Your Vue.js App" />
  5. <p>{{ info }}</p>
  6. <!-- 3.使用组件 -->
  7. <Header @onOver="getOverInfo" @onOut="getOutInfo" ></Header>
  8. </div>
  9. </template>
  10. <script>
  11. import HelloWorld from "./components/HelloWorld.vue";
  12. import Header from "./components/header.vue"; // 1.引入组件
  13. export default {
  14. name: "App",
  15. components: {
  16. HelloWorld,
  17. Header, // 2.注册组件
  18. },
  19. data() {
  20. return {
  21. info: "",
  22. };
  23. },
  24. methods: {
  25. getOverInfo(msg) {
  26. this.info = msg;
  27. },
  28. getOutInfo(msg) {
  29. this.info = msg;
  30. },
  31. },
  32. };
  33. </script>
  34. <style>
  35. #app {
  36. font-family: Avenir, Helvetica, Arial, sans-serif;
  37. -webkit-font-smoothing: antialiased;
  38. -moz-osx-font-smoothing: grayscale;
  39. text-align: center;
  40. color: #2c3e50;
  41. margin-top: 60px;
  42. }
  43. </style>