Vue快速入门-2-Vue框架高级操作
更新:HHH   时间:2023-1-7


小生博客:http://xsboke.blog.51cto.com

        -------谢谢您的参考,如有疑问,欢迎交流

目录:

1. 自定义组件
2. 全局注册的自定义组件
3. 局部注册自定义组件
4. 组件的嵌套
5. 组件的动态切换
6. Vue的ajax
  1. 自定义组件
    就相当于自定义标签,其实底层还是html标签,只不过是套了个名字

    自定义组件分为全局注册和局部注册
    共同点:
        为什么data必须以函数方式返回数据?
            因为在函数中,变量属于内部变量,这样当自定义组件被多次引用时变量不会互相影响.
        只能在Vue对象中使用自定义组件

    不同点:
        全局注册的自定义组件:创建组件之后,只要是Vue对象就可以使用
        局部注册的自定义组件:在Vue实例中使用components选项来定义你的局部组件
  1. 全局注册的自定义组件

    2.1 组件的结构

        Vue.component('component-name',{ /*  ......  */})
    
        -- 'component-name'             组件名称
        -- { /*  ......  */}            组件的内容(执行的函数)

    2.2 简单组件的实现

        <div id="app">
             <button-counter></button-counter>
        </div>
    
        <div id="app1">
             <button-counter></button-counter>
        </div>
    
        <script type="text/javascript">
            // 自定义组件也是一个Vue对象,因此之前的data,methods,钩子函数都是可用的
            Vue.component('button-counter',{
                data:function(){                                                        -- 因为返回的是函数,所以两个应用了组件的标签中的count值是互不影响的
                    return {                                                            -- 如果需要所有应用的当前组件的count值都一样,可以定义一个全局变量再引入这里
                        count:0
                    }
                },
                // 自定义组件最后返回的结果
                template:'<button v-on:click="count++"><b>{{count}}</b></button>'       -- 当点击按钮时,count的值就+1,template定义的是真正生成的html
            })
    
            new Vue({el:'#app'})                                                        -- 可以看到只要是Vue对象就可以应用全局自定义组件
            new Vue({el:'#app1'})
        </script>

    2.3 当你需要多个组件之间的data返回值相同时可以这样解决.

         <div id="app">
             <button-counter></button-counter>
             <button-counter></button-counter>
         </div>
    
        <script type="text/javascript">
    
            var mydata= {count:0}                                                   -- 在外部定义变量
    
            // 自定义组件也是一个Vue对象,因此之前的data,methods,钩子函数都是可用的
            Vue.component('button-counter',{
                data:function(){
                    return mydata;                                                  -- 在组件中应用
                },
                // 自定义组件最后返回的结果
                template:'<button v-on:click="count++"><b>{{count}}</b></button>'
            })
    
            new Vue({el:'#app'})
    
        </script>

    2.4 解决你template里面的内容比较庞大时的操作

    ```
    <head>
        <script type="text/template" id="temp">                 -- 首先在head中定义一个类型(type)为"text/template"的script标签,然后增加一个唯一的属性如下id="temp"
            <div>
                {{message}}
                <ul>
                    <li>第一部分:Vue基本语法</li>
                    <li>第二部分:自定义组件</li>
                </ul>
            </div>
        </script>
    </head>
    
    <body>
        <div id="app">
            <my-header></my-header>
        </div>
    
        <div id="app2">
            <my-header></my-header>
        </div>
    
        <script type="text/javascript">
            Vue.component('my-header',{
                template:'#temp'                            -- 然后在template中指定这个id名即可
            });
    
            new Vue({el:'#app'});
            new Vue({el:'#app2'});
        </script>
    </body>
    ```
  2. 局部注册自定义组件
    局部注册自定义标签就是在Vue实例里面通过components选项创建自定义标签

    <head>
        <script type="text/template" id="temp">
            <div>
                {{message}}
                <ul>
                    <li>第一部分:Vue基本语法</li>
                    <li>第二部分:自定义组件</li>
                </ul>
            </div>
        </script>
    </head>

    <body>
        <div id="app">
            <my-header></my-header>
        </div>

        <script type="text/javascript">
            // 局部组件就是Vue对象内部定义的组件,仅仅自身可以使用
            var vue = new Vue({
                el:'#app',
                components:{
                    'my-header':{                                   --  创建一个名为'my-header'的自定义标签
                        template:'#temp',                           --  关联模板
                        data:function(){
                            return{
                                message:'hello vue'
                            }
                        }
                    }
                }
            })
        </script>
    </body>
  1. 组件的嵌套
    知识点:使用slot的name属性,用来关联标签或者组件,实现定义嵌套标签或者组件的位置

        <div id="app">
            <my-header>
                <my-title>组件与组件之间嵌套</my-title>
            </my-header>
        </div>

        <div id="app2">
            <my-header>
                <button slot="vleft">左</button>                         -- 这里的slot值必须和Vue实例中components选项的name值一样
                <button slot="vright">右</button>
            </my-header>
        </div>

        <script>
            var vue = new Vue({
                el:'#app',
                // 组件局部注册
                components:{
                    'my-header':{
                        // 系统给定的slot来实现标签的嵌套操作
                        template:'<div>我是头部内容<slot /></div>'            -- 当只需要嵌套一个标签或组件时,直接使用slot,不需要定义name
                    },
                    'my-title':{
                        template:'<h4>我是标题!!</h4>'
                    }
                }
            });

            var vue = new Vue({
                el:'#app2',
                // 组件局部注册
                components:{
                    'my-header':{
                        // 系统给定的slot来实现标签的嵌套操作
                        template:'<div><slot name="vleft" />我是头部内容<slot name="vright" /></div>'
                    }
                }
            })
        </script>
  1. 组件的动态切换
    类似JQuery的tab
        <!-- 
           1: component标签的is属性来完成组件动态绑定
           2: 按钮的@click来修改data属性从而切换组件
           3:  keep-alive 标签来保留组件的状态值
        -->
        <div id="app">
            <button @click="changeComp(1)">第一项</button>
            <button @click="changeComp(2)">第二项</button>             -- 点击按钮时执行changeComp函数,并且传入实参"2".
            <button @click="changeComp(3)">第三项</button>
            <keep-alive>                                                -- 使用keep-alive标签可以保留当前组件的状态值,防止组件之间切换时,值丢失
                <component v-bind:is="nowHeader"></component>
            </keep-alive>
        </div>
        <script>
            var vue = new Vue({
                el:'#app',
                data:{
                    nowHeader:'header-1'
                },
                components:{
                    'header-1':{template:'<div>组件1:<input /></div>'},
                    'header-2':{template:'<div>组件2:<input /></div>'},
                    'header-3':{template:'<div>组件3:<input /></div>'},
                },
                methods:{
                    changeComp:function(index){
                        this.nowHeader = 'header-' + index              -- 当changeComp函数被触发时,Vue实例data中的变量"nowHeader",将根据实参的值而发生变化
                    }
                }
            })
        </script>
  1. Vue的ajax

详情查看axios中文手册

    中文手册:https://www.kancloud.cn/yunye/axios/234845
    自2.0之后Vue使用axios实现ajax功能
        -- 注意使用axios需要引入axios的js文件
        <table id="app" border="1" width="300px">
            <!-- item就是循环的每个对象 -->
            <tr v-for="item in result">
                <td>{{item.id}}</td>
                <td>{{item.name}}</td>
                <td>{{item.age}}</td>
            </tr>
        </table>

        <script>
            var vue = new Vue({
                el:'#app',
                data:{
                        result:[]
                     },
                created:function(){                                     -- 在创建VUE实例后执行这个函数
                     // 通过axios访问远程数据
                    axios.get("data.json").then(function(result){       -- then是操作成功后执行的函数
                        this.result = eval(result.data);                -- axios获取的数据默认是string(这将导致您不能循环列表,字典等),可以使用eval将string的格式转换成对象
                    }.bind(this));                                      -- bind(this)的意思是将Vue实例中的this和axios中的this绑定到一块,
                }                                                       -- 因为axios和Vue实例的数据是不互通的
            })
        </script>

        then        --      操作成功后执行的动作
        catch       --      操作异常时执行的动作
返回开发技术教程...