• Vue组件详解


    目录

    全局组件:

    定义局部组件

    方式一:

    方式二:

    在组件里定义属性(props):

    添加事件/方法:

    事件的传递:


    组件可以说是vue最强大的功能之一,组件可以扩展HTML元素,封装可重用的代码。

    全局组件:

    首先注册一个全局组件的语法格式如下:

    Vue.component(tagName,options);

    参数1:(tagName)组件名称----自定义

                 通过:来调用

    参数2:(options)组件配置对象

                  通过{template:'标签'}来配置,template用来书写html代码,且必须有且只有一个容器,否认则会报错

    例子:

    定义组件要在Vue实例之外,而且必须有一个作用域(不用调用,默认配置),如果有多个作用域会全部配置

    1. <div id="app">
    2. <login></login>
    3. </div>
    4. <script src="js/vue.js"></script>
    5. <script>
    6. Vue.component('login',{
    7. template:"

      用户登录

      "
      ,
    8. });
    9. const app = new Vue({
    10. el: "#app",
    11. data: {},
    12. });

    定义局部组件

    方式一:

    首先要定义一个组件:

    然后在实例的作用域中进行组件挂载

    组件挂载需要用到components,

            挂载有两个参数,第一个参数是我要在html中写的组件名,第二个是我要挂载的组件名

            ps:如果两个参数名相同可以简写成一个,也是可以的

    1. <div id="app">
    2. <login1></login1>
    3. </div>
    4. =================
    5. let login = {
    6. template: "

      我是局部组件

      "
      ,
    7. }
    8. const app = new Vue({
    9. el:"#app",
    10. data:{},
    11. methods:{},
    12. components:{
    13. //挂载组件
    14. login1:login
    15. },
    16. });

    方式二:

    在html中写一个template标签并给其一个id,通过给定义组件的template赋予id,就可以获取了,毕竟我们不可能在js里写一大堆html代码,我们还是希望在html写html,在js里写js

    1. <div id="app">
    2. <login1></login1>
    3. </div>
    4. <!-- 定义局部组件 -->
    5. <!-- 需要定义一个id -->
    6. <template id="loginT">
    7. <div>
    8. <h1>我是template里的局部组件</h1>
    9. </div>
    10. </template>
    11. <script src="js/vue.js"></script>
    12. <script>
    13. let login = {
    14. template: "#loginT",//id名写里面
    15. }
    16. const app = new Vue({
    17. el:"#app",
    18. data:{},
    19. methods:{},
    20. components:{
    21. //挂载组件
    22. login1:login
    23. },
    24. });
    25. </script>

    在组件里定义属性(props):

    在定义组件里是不能直接获取实例里的数据的,获取数据方式:

    1. <div id="app">
    2. <!-- //属性绑定 -->
    3. <login1 :username="username" :age="age"></login1>
    4. <login1></login1>
    5. </div>
    6. <!-- 定义局部组件 -->
    7. <!-- 需要定义一个id -->
    8. <template id="loginT">
    9. <div>
    10. <h1>{{name}},{{ag}}</h1>
    11. <h1>{{username}},{{age}}</h1>
    12. </div>
    13. </template>
    14. <script src="js/vue.js"></script>
    15. <script>
    16. let login = {
    17. template: "#loginT",//id名写里面
    18. //把数据挂载过来
    19. data(){
    20. return{
    21. name:"xiaoqiang",
    22. ag:23,
    23. }
    24. },
    25. props:["username","age"],//只能用于属性的定义
    26. }
    27. const app = new Vue({
    28. el:"#app",
    29. data:{
    30. username:"zhangsan",
    31. age:12,
    32. },
    33. methods:{},
    34. components:{
    35. //挂载组件
    36. login1:login
    37. },
    38. });
    39. </script>

    非常难以理解:(理解不上去可以不理解,我也不是很明白,如果有写错的,请诸位教正)

    一定要参照代码来理解:

    前提:props用于定义属性,你要理解,属性定义的只是属性,

    在template里你想获取作用域里的属性:

            {{属性名}},一定要和props里的属性名相同,且在html里自定义的组件里进行属性绑定,:属性="作用域里的属性名",

    要想通过定义组件获取内容,需要先把属性挂载回来通过data(){return{}},里面可以定义属性,但千万切记,属性名不可以和props定义的属性一样,html里不需要进行属性绑定.如果名字相同,就会去找作用域里的属性,没有就会报错,没有属性绑定也会报错

    添加事件/方法:

    既然属性可以挂载回来,那么事件也可以挂载回来methods:{},里面就是正常的事件书写方式

    1. <div id="app">
    2. <login :username="username" @aaa="findAll"></login>
    3. </div>
    4. <!-- 定义局部组件 -->
    5. <template id="loginTemplate">
    6. <div>
    7. <h1>用户登录:{{username}}</h1>
    8. <ul>
    9. <li v-for="(item,index) in lists">
    10. {{index}} --- {{item}}
    11. </li>
    12. </ul>
    13. <button @click="change">触发组件中的事件</button>
    14. </div>
    15. </template>
    16. <script src="js/vue.js"></script>
    17. <script>
    18. // 定义一个局部组件
    19. let login = {
    20. template: "#loginTemplate",
    21. data() {
    22. return {
    23. name:"xiaoqiang",
    24. lists:['java','c++','python']
    25. }
    26. },
    27. props:['username'],
    28. methods: {
    29. change() {
    30. alert(this.name);//获取组件的姓名
    31. alert(this.username);//获取作用域里的姓名
    32. this.$emit('aaa');
    33. }
    34. },
    35. }
    36. const app = new Vue({
    37. el: "#app",
    38. data: {
    39. username:"zhangsan",
    40. age:23
    41. },
    42. methods: {
    43. findAll() {
    44. alert("Vue实例中定义的函数");
    45. }
    46. },
    47. components:{
    48. login
    49. }
    50. });
    51. </script>

    事件的传递:

    调用的函数(findAll)是写在html里的,所以调用的函数是要写在实例的methods中,那我要想点击组件里的按钮调用我在html里写的事件该怎么做:this.$emit('aaa');-------按照上面代码写的,html里:@aaa="findAll";

  • 相关阅读:
    SQL binary 轉float 絕對好用
    社交电商盲盒活动方案,让消费者享受购物乐趣
    制作一个简单HTML宠物猫网页(HTML+CSS)
    基于开源库libreDWG+Java实现AutoCad格式DWG转DXF
    微信、支付宝、字节多平台小程序集成到企业App的兼容处理
    Redis哨兵模式配置文件详解
    QUIC不是TCP的替代品
    const的自己理解
    java 循环结构语句
    【python第三方库】configparser---python解析config文件入门
  • 原文地址:https://blog.csdn.net/weixin_49627122/article/details/126590628