1、组件的作用

通常一个项目会以一棵嵌套的组件树的形式来组织,这样可以极大的模块化管理和实现代码重用,如下:
image.png

2、创建一个自定义组件

如下创建一个自定义组件MyCustomComponent.vue:

  1. <template>
  2. <div>
  3. <span>这是我的自定义组件</span>
  4. </div>
  5. </template>
  6. <script>
  7. export default{
  8. name:"MyCustomComponent",
  9. }
  10. </script>

3、组件的加载

如下在App.vue中导入并在template中引用展示即可。

  1. <template>
  2. <img alt="Vue logo" src="./assets/logo.png">
  3. <MyComponent/>
  4. </template>
  5. <script>
  6. import MyComponent from './components/MyCustomComponent.vue'
  7. export default {
  8. name: 'App',
  9. components: {
  10. MyComponent
  11. }
  12. }
  13. </script>
  14. <style>
  15. #app {
  16. font-family: Avenir, Helvetica, Arial, sans-serif;
  17. -webkit-font-smoothing: antialiased;
  18. -moz-osx-font-smoothing: grayscale;
  19. text-align: center;
  20. color: #2c3e50;
  21. margin-top: 60px;
  22. }
  23. </style>

效果如下:
image.png

4、组件间通讯之props传递数据

props的作用是用于父vue组件向子vue组件传递数据的,比如由App.vue向MyCustomComponent.vue组件传递数据。
props类型:

  1. props:{
  2. title:String,
  3. likes:Number,
  4. flag:Boolean,
  5. students:Array,
  6. person:Object,
  7. callback:Function
  8. }

MyCustomComponent.vue文件:

  1. <template>
  2. <div>
  3. <p>这是我的自定义组件</p>
  4. <p>由app.vue向MyCustomComponent子组件传递数据</p>
  5. <p>父级组件传递过来的数据:{{title}}</p>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. name: "MyCustomComponent",
  11. props: {
  12. title: {
  13. type: String,
  14. default: ""
  15. }
  16. }
  17. }
  18. </script>
  19. <style scoped>
  20. </style>

App.vue文件:

  1. <template>
  2. <img alt="Vue logo" src="./assets/logo.png">
  3. <MyComponent :title="tmp"/>
  4. </template>
  5. <script>
  6. import MyComponent from './components/MyCustomComponent.vue'
  7. export default {
  8. name: 'App',
  9. data(){
  10. return {
  11. tmp:'这个是由父级组件传递过来的数据'
  12. }
  13. },
  14. components: {
  15. MyComponent
  16. }
  17. }
  18. </script>
  19. <style>
  20. #app {
  21. font-family: Avenir, Helvetica, Arial, sans-serif;
  22. -webkit-font-smoothing: antialiased;
  23. -moz-osx-font-smoothing: grayscale;
  24. text-align: center;
  25. color: #2c3e50;
  26. margin-top: 60px;
  27. }
  28. </style>

效果如下:
image.png

5、组件间通讯之自定义方法$emit传递数据

自定义方法的作用主要是由子组件向父级组件传递数据
MyCustomComponent.vue文件:

  1. <template>
  2. <div>
  3. <p>这是我的自定义组件</p>
  4. <p>由app.vueMyCustomComponent子组件传递数据</p>
  5. <p>父级组件传递过来的数据:{{ title }}</p>
  6. <button @click="btnClick(hi)">点击传递数据给父级组件</button>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. name: "MyCustomComponent",
  12. data() {
  13. return {
  14. hi: '这个由子组件传递过来的数据'
  15. }
  16. },
  17. props: {
  18. title: {
  19. type: String,
  20. default: ""
  21. }
  22. },
  23. methods: {
  24. btnClick() {
  25. // 参数1,在父级组件中是通过这个名称进行参数获取的
  26. // 参数2,你要传递的数据内容
  27. this.$emit("onCustomComponentData", this.hi);
  28. }
  29. }
  30. }
  31. </script>
  32. <style scoped>
  33. </style>

app.vue文件:

  1. <template>
  2. <img alt="Vue logo" src="./assets/logo.png">
  3. <MyComponent :title="tmp" @onCustomComponentData="getChildData" />
  4. <h3>子级组件传递过来的数据:{{ customComponentData }}</h3>
  5. </template>
  6. <script>
  7. import MyComponent from './components/MyCustomComponent.vue'
  8. export default {
  9. name: 'App',
  10. data() {
  11. return {
  12. tmp: '标题',
  13. customComponentData: ''
  14. }
  15. },
  16. components: {
  17. MyComponent
  18. },
  19. methods: {
  20. getChildData(data) {
  21. this.customComponentData = data;
  22. }
  23. }
  24. }
  25. </script>
  26. <style>
  27. #app {
  28. font-family: Avenir, Helvetica, Arial, sans-serif;
  29. -webkit-font-smoothing: antialiased;
  30. -moz-osx-font-smoothing: grayscale;
  31. text-align: center;
  32. color: #2c3e50;
  33. margin-top: 60px;
  34. }
  35. </style>