当前位置:   article > 正文

有关组件的知识点(非常详细)_组件技术知识点

组件技术知识点

目录

1.组件机制

1.1含义

1.2特点

2.组件注册

2.1全局注册

2.2局部注册

3.组件传值 

3.1父组件给子组件传值

3.11静态传值

3.12动态传值

3.13类型校验

 3.2子组件给父组件传值

4.兄弟组件传值

5.祖先与子孙组件之间的传值

5.1祖先向子孙组件传值

5.2单向数据绑定


1.组件机制

1.1含义

组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。

1.2特点

  • 组件是可以进行任意次数的复用。
  • 组件的data必须是一个函数,确保每个实例可以维护一份被返回对象的独立的拷贝,也就是任何一个组件的改变不会影响到其它组件。

2.组件注册

2.1全局注册

可以使用Vue.component(tagName, options) 注册一个全局组件, 注册之后可以用在任何新创建的 Vue 实例的模板中使用。

  1. <script src="https://cdn.jsdelivr.net/npm/vue@2.7.10/dist/vue.js"></script>
  2. <div id="app">
  3. <!-- 3.组件使用 -->
  4. <my-a></my-a>
  5. <my-b></my-b>
  6. </div>
  7. <script>
  8. // 1.定义组件配置对象
  9. let myA={
  10. template:`
  11. <div>
  12. {{msgA}}
  13. </div>
  14. `,
  15. data(){
  16. return {
  17. msgA:'我是子组件'
  18. }
  19. }
  20. };
  21. let myB={
  22. template:`
  23. <div>B组件
  24. ------------------
  25. <my-a></my-a>
  26. </div>
  27. `
  28. }
  29. // 2.注册组件
  30. // 1.全局注册 --任意组件里面使用
  31. Vue.component('my-a',myA);
  32. Vue.component('my-b',myB);
  33. new Vue({
  34. el:"#app",
  35. data:{
  36. msg:'我是父组件'
  37. },
  38. methods:{
  39. }
  40. })
  41. </script>

2.2局部注册

全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。局部注册的组件只能在当前组件中使用。

  1. <script src="https://cdn.jsdelivr.net/npm/vue@2.7.10/dist/vue.js"></script>
  2. <div id="app">
  3. <my-a></my-a>
  4. <my-b></my-b>
  5. </div>
  6. <script>
  7. // 1.定义组件配置对象
  8. let myA = {
  9. template: `
  10. <div>
  11. {{msgA}}
  12. </div>
  13. `,
  14. data() {
  15. return {
  16. msgA: '我是子组件'
  17. }
  18. }
  19. };
  20. let myB = {
  21. components: {
  22. 'my-a': myA
  23. },
  24. template: `
  25. <div>B组件
  26. ------------------
  27. <my-a></my-a>
  28. </div>
  29. `
  30. }
  31. new Vue({
  32. // 2.局部注册 --只能在根组件使用
  33. components: {
  34. 'my-a': myA,
  35. 'my-b': myB
  36. },
  37. el: "#app",
  38. data: {
  39. msg: '我是父组件'
  40. },
  41. methods: {
  42. }
  43. })
  44. </script>

3.组件传值 

3.1父组件给子组件传值

  • 将传递的数据写入子组件。
  • 在子组件内使用props接收数据。

3.11静态传值

  1. <div id="app">
  2. <my-a msg1="我是静态传递"></my-a>
  3. </div>
  4. <script>
  5. let myA = {
  6. props: ['msg1'],
  7. template: `
  8. <div>
  9. 我是子组件----
  10. {{msg}}
  11. </div>
  12. `
  13. }
  14. new Vue({
  15. components: {
  16. 'my-a': myA
  17. },
  18. el: '#app',
  19. data: {
  20. msg: '我是父组件'
  21. }
  22. })
  23. </script>

3.12动态传值

  1. <div id="app">
  2. <my-a :obj="'我是动态传递'"></my-a>
  3. </div>
  4. <script>
  5. let myA = {
  6. props: ['obj'],
  7. template: `
  8. <div>
  9. 我是子组件----
  10. {{obj}}
  11. </div>
  12. `
  13. }
  14. new Vue({
  15. components: {
  16. 'my-a': myA
  17. },
  18. el: '#app',
  19. data: {
  20. msg: '我是父组件'
  21. }
  22. })
  23. </script>

3.13类型校验

validator:对数值进行校验。

  1. <div id="app">
  2. <my-a :age="18" :obj="{name:'zhangsan'}" :stu='[1,2,3]' :sub1="undefined" :sub="null"></my-a>
  3. </div>
  4. <script>
  5. let myA = {
  6. props: {
  7. age: {
  8. // 可以进行多个类型值得校验
  9. type: [Number, String, Boolean],
  10. // 自定义校验器规则 小于50就对
  11. validator(val) {
  12. return val < 50
  13. }
  14. },
  15. sub: String,
  16. obj: Object,
  17. sub1: Number,
  18. stu: {
  19. type: Array,
  20. // 默认值 错误
  21. // default:[4,5,6]
  22. default() {
  23. return [4, 5, 6]
  24. }
  25. }
  26. },
  27. template: `
  28. <div>
  29. 我是子组件----
  30. {{age}}
  31. {{obj}}
  32. {{stu}}
  33. {{sub}}
  34. {{sub1}}
  35. </div>
  36. `
  37. }
  38. new Vue({
  39. components: {
  40. 'my-a': myA
  41. },
  42. el: '#app',
  43. data: {
  44. msg: '我是父组件'
  45. }
  46. })
  47. </script>

 3.2子组件给父组件传值

  • 在子组件内发射自定义事件 $emit('自定义事件名称',传递的数据)
  • 在子组件标签上使用自定义事件来接受 @自定义事件='handler'
        handler(a){}
  1. <div id="app">
  2. <!-- 在父组件使用子组件的标签定义自定义事件 -->
  3. <my-a @my-event="handler"></my-a>
  4. </div>
  5. <script>
  6. let myA = {
  7. template: `
  8. <div>
  9. 我是子组件
  10. <button @click='toSend'>子组件传值给父组件</button>
  11. </div>
  12. `,
  13. data() {
  14. return {
  15. subMsg: '我是子组件A --我要给父组件传值'
  16. }
  17. },
  18. methods: {
  19. toSend() {
  20. this.$emit('my-event', this.subMsg)
  21. }
  22. }
  23. }
  24. new Vue({
  25. components: {
  26. 'my-a': myA
  27. },
  28. el: "#app",
  29. data: {
  30. msg: '我是父组件'
  31. },
  32. methods: {
  33. handler(a) {
  34. console.log(a, '这是子组件的值');
  35. }
  36. },
  37. })
  38. </script>

4.兄弟组件传值

  • 定义一个事件总线 new Vue()
  • 引入事件总线,使用事件总线Bus.$emit(事件名称,发送的数据)
  • 另一页面,引入事件总线,使用事件总线Bus.$son(事件名称,(a)=>{a ---->收到数据})

事件总线

  1. import Vue from 'vue';
  2. export default new Vue();

Header.vue页面

  1. <template>
  2. <div>
  3. {{ msgH }}
  4. <button @click="handler">传值给Footer</button>
  5. </div>
  6. </template>
  7. <script>
  8. //引入事件总线
  9. import Bus from "../eventBus.js";
  10. console.log(Bus, "事件总线");
  11. export default {
  12. data() {
  13. return {
  14. msgH: "头部组件",
  15. Footer: "这是兄弟组件Footer",
  16. };
  17. },
  18. methods: {
  19. handler() {
  20. // 兄弟组件传值
  21. // 1.兄弟组件使用$emit 发射事件 携带参数
  22. Bus.$emit("toFoot", this.Footer);
  23. },
  24. },
  25. };
  26. </script>

Footer.vue页面

  1. <template>
  2. <div>
  3. {{ msgF }}
  4. </div>
  5. </template>
  6. <script>
  7. // 引入事件总线
  8. import Bus from "../eventBus.js";
  9. export default {
  10. data() {
  11. return {
  12. msgF: "底部组件",
  13. };
  14. },
  15. created() {
  16. //('事件名称' 收到的数据)
  17. Bus.$on("toFoot", (a) => {
  18. console.log(a, "这是Footer传给我的值");
  19. });
  20. },
  21. };
  22. </script>

 

5.祖先与子孙组件之间的传值

5.1祖先向子孙组件传值

App.vue页面

  1. <template>
  2. <div id="app">
  3. <img alt="Vue logo" src="./assets/logo.png" />
  4. <Header></Header>
  5. <hr />
  6. <Footer>
  7. <!-- 根组件的孙子组件 -->
  8. <FooterChild></FooterChild>
  9. </Footer>
  10. </div>
  11. </template>
  12. <script>
  13. import Header from "./components/Header.vue";
  14. import Footer from "./components/Footer.vue";
  15. export default {
  16. name: "App",
  17. components: {
  18. Header,
  19. Footer,
  20. },
  21. data() {
  22. return {
  23. msg: "我是祖先组件",
  24. a:13
  25. };
  26. },
  27. // 祖先组件使用provide方法提供传递的数据
  28. provide() {
  29. return {
  30. msg: this.msg,
  31. a: this.a,
  32. };
  33. },
  34. };
  35. </script>

FooterChild.vue

  1. <template>
  2. <div>
  3. {{ msg }}---{{ a }}
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. msgC: "底部组件的子组件",
  11. };
  12. },
  13. // 注入数据
  14. inject: ["msg", "a"],
  15. };
  16. </script>

5.2单向数据绑定

Footer.vue

  1. <template>
  2. <div>
  3. {{ msgF }}
  4. <FooterChild :age="age" />
  5. {{ age }}
  6. <button @click="age = 18">点击我修改age</button>
  7. </div>
  8. </template>
  9. <script>
  10. import Bus from "../eventBus.js";
  11. import FooterChild from "./FooterChild.vue";
  12. export default {
  13. components: {
  14. FooterChild,
  15. },
  16. data() {
  17. return {
  18. msgF: "底部组件",
  19. age: 15,
  20. };
  21. },
  22. created() {
  23. // {prototype:$emit() $on()}
  24. Bus.$on("toFoot", (a) => {
  25. console.log(a, "这是Footer传给我得值");
  26. });
  27. },
  28. };
  29. </script>

FooterChild.vue

  1. <template>
  2. <div>
  3. {{ msgC }}-{{ msg }}--{{ a }}--{{ age }}
  4. <button @click="age = 250">点击我修改age</button>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data() {
  10. return {
  11. msgC: "底部组件的子组件",
  12. };
  13. },
  14. // 注入数据
  15. inject: ["msg", "a"],
  16. // 给父组件传递age数值
  17. props: ["age"],
  18. };
  19. </script>

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/636366
推荐阅读
相关标签
  

闽ICP备14008679号