Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,其中组件是其核心概念之一。组件可以帮助你将页面拆分成独立的、可复用的部分。学习如何创建、使用和管理 Vue.js 组件。这些知识可以帮助你构建更加模块化、可维护和可重用的 Vue.js 应用。

1、创建组件

单文件组件是 Vue 组件的推荐方式,使用 .vue 文件格式来定义组件的模板、脚本和样式。

<!-- HelloWorld.vue -->
<template>
  <div class="hello">
    <h1>{{ message }}</h1>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    message: String
  }
}
</script>

<style scoped>
.hello {
  color: blue;
}
</style>

1)全局注册组件

main.js 文件中,可以全局注册组件:

import Vue from 'vue';
import App from './App.vue';
import HelloWorld from './components/HelloWorld.vue';

Vue.component('HelloWorld', HelloWorld);

new Vue({
  render: h => h(App),
}).$mount('#app');

2)局部注册组件

<template>
  <div id="app">
    <HelloWorld message="Hello Vue!"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue';

export default {
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>

2、组件的属性(Props)

Props 是父组件传递给子组件的数据。子组件通过 props 选项声明它们期望接收的 prop

<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  name: 'ChildComponent',
  props: {
    message: {
      type: String,
      required: true
    }
  }
}
</script>

父组件使用该子组件时传递 message prop:

<template>
  <div>
    <ChildComponent message="Hello from parent"/>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  name: 'ParentComponent',
  components: {
    ChildComponent
  }
}
</script>

3、组件的事件(Events)

子组件可以通过 $emit 方法向父组件发送事件,父组件可以监听这些事件。

1)子组件

<template>
  <button @click="sendMessage">Click me</button>
</template>

<script>
export default {
  name: 'ChildComponent',
  methods: {
    sendMessage() {
      this.$emit('message-sent', 'Hello from child');
    }
  }
}
</script>

2)父组件

<template>
  <div>
    <ChildComponent @message-sent="handleMessage"/>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  name: 'ParentComponent',
  components: {
    ChildComponent
  },
  methods: {
    handleMessage(message) {
      console.log(message);
    }
  }
}
</script>

4、插槽(Slots)

插槽可以在子组件模板中插入内容。

1)默认插槽

<template>
  <div>
    <slot></slot>
  </div>
</template>

使用子组件时,可以在组件标签中嵌入内容:

<template>
  <div>
    <ChildComponent>
      <p>This is some slot content</p>
    </ChildComponent>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  name: 'ParentComponent',
  components: {
    ChildComponent
  }
}
</script>

2)具名插槽

<template>
  <div>
    <slot name="header"></slot>
    <slot></slot>
    <slot name="footer"></slot>
  </div>
</template>

使用具名插槽:

<template>
  <div>
    <ChildComponent>
      <template v-slot:header>
        <h1>This is the header</h1>
      </template>
      <p>This is some default slot content</p>
      <template v-slot:footer>
        <p>This is the footer</p>
      </template>
    </ChildComponent>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  name: 'ParentComponent',
  components: {
    ChildComponent
  }
}
</script>

5、动态组件

Vue 提供了 component 组件,可以动态地在多个组件之间进行切换:

<template>
  <div>
    <component :is="currentComponent"></component>
    <button @click="toggleComponent">Toggle Component</button>
  </div>
</template>

<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';

export default {
  name: 'DynamicComponent',
  data() {
    return {
      currentComponent: 'ComponentA'
    }
  },
  components: {
    ComponentA,
    ComponentB
  },
  methods: {
    toggleComponent() {
      this.currentComponent = this.currentComponent === 'ComponentA' ? 'ComponentB' : 'ComponentA';
    }
  }
}
</script>

6、异步组件

Vue 可以定义返回一个 Promise 的工厂函数,来按需加载组件:

const AsyncComponent = () => ({
  component: import('./AsyncComponent.vue'),
  loading: LoadingComponent,
  error: ErrorComponent,
  delay: 200,
  timeout: 3000
});

export default {
  components: {
    AsyncComponent
  }
}

推荐文档