七.Vue.js自定义组件 - 组件创建及使用

什么是组件?组件能把页面分成独立的模块,实现代码重用,提高开发效率和代码质量,使得代码易于维护 。

Vue.js 组件分为全局组件局部组件动态组件,父子关系的组件数据交互用props子组件向父组件的数据传递,使用 $emit

1. 全局组件,通过 Vue.component() 去注册全局组件

Vue.component('组件名称',配置参数对象),使用方式

<!DOCTYPE html>
<html>
    <body>
        <div id="app1">
            <!-- 3. #app是Vue实例挂载的元素,应该在挂载元素范围内使用组件-->
            <my-component message="message"></my-component>
        </div>
        <div id="app2">
            <!-- 3. #app是Vue实例挂载的元素,应该在挂载元素范围内使用组件-->
            <my-component message="message"></my-component>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        // 方式一:注册组件,传入一个扩展过的构造器
        Vue.component('my-component', Vue.extend({ 
            template: '<p>{{lastName}} {{firstName}} {{message}}</p>',
            props:["message"],
            data: function () {
                return {
                  firstName: 'xiaochong',
                  lastName: 'li'
                }
             }
         }));
         // 方式二:传入一个选项对象 (自动调用 Vue.extend)
         Vue.component('my-component', { 
            template: '<p>{{lastName}} {{firstName}} {{message}}</p>',
            props:["message"],
            data: function () {
                return {
                  firstName: 'xiaochong',
                  lastName: 'li'
                }
             }
         });

        // 使用组件,组件应该挂载到某个Vue实例下,否则它不会生效。
        var app1 =  new Vue({
             el: '#app1',
             data: {
                message: '你好!一起学习组件'
             }
         });

         /*定义vue实例app2*/
        var app2 = new Vue({
            el: '#app2',
            data: {
                message: '你好!我也能用全局组件'
             }
        });

        
    </script>
</html>


// 获取注册的组件 (始终返回构造器)
var MyComponent = Vue.component('my-component')

 

2. 局部组件,通过在 new Vue 添加components属性配置。完成局部组件注册

<!DOCTYPE html>
<html>
    <body>
        <div id="app">
            <!-- my-component只能在#app下使用-->
            <my-component></my-component>
        </div>
        <div id="app2">
            <!-- app2并未注册组件,不能使用-->
            <my-component></my-component>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        // 1.创建一个组件构造器
        var myComponent = Vue.extend({
            template: '<div>局部组件!</div>'
        });
        
        var app = new Vue({
            el: '#app',
            components: {
                // 2. 将myComponent组件注册到Vue实例下
                'my-component' : myComponent
            }
        });
        var app2 = new Vue({
            el: '#app2'
        });
    </script>
</html>

 

3. 动态组件,通过<component></component>标签和 is 属性切换实现,动态组件结合<keep-alive></keep-alive>完成组件缓存,即保留用户的筛选(或选中)状态

<!DOCTYPE html>
<html>
    <body>
        <div id="app">
            <button @click="selectName='my-component-A'">菜单1</button>
            <button @click="selectName='my-component-B'">菜单2</button>
            <button @click="selectName='my-component-C'">菜单3</button>
            <keep-alive include="my-component-A"><!--只有a的值被缓存了-->           
                <component :is="selectName"></component>
            </keep-alive>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        // 1.创建一个组件构造器
        var myComponent = Vue.extend({
            template: '<div>局部组件!</div>'
        });
        
        var app = new Vue({
            el: '#app',
            data: {
                selectName: 'my-component-A'
            },
            components: {
                'my-component-A' : {
                    template:'<h1>菜单1内容</h1>'
                },
                'my-component-B' : {
                    template:'<h1>菜单2内容</h1>'
                },
                'my-component-c' : {
                    template:'<h1>菜单3内容</h1>'
                },
            }
        });
        var app2 = new Vue({
            el: '#app2'
        });
    </script>
</html>       

 

<keep-alive></keep-alive>

keep-alive应用场景:列表界面通过筛选条件,筛选出一批数据,点击数据进入详情后再返回列表界面,列表可以保持进入详情前的数据。

keep-alive属性设置有:

include - 字符串或正则表达式。只有名称匹配的组件会被缓存。include="my-component-A"、:include="[my-component-A,my-component-B]"

exclude - 字符串或正则表达式。名称匹配的组件都不会被缓存,用法和 include 一样

max - 数字。最多可以缓存多少组件实例。


http://www.niftyadmin.cn/n/1867387.html

相关文章

十二.Vue.js路由Vue Router使用

vue router 主要用于url地址配置&#xff0c;实现更改浏览器历史访问记录、页面跳转、页面跳转不刷新、页面访问权限拦截、滚动条滚动到指定位置、设置界面title等功能。 主要方式有url中的 hash&#xff08;#&#xff09;方式和 history。 hash&#xff1a;可以通过window.h…

十三.Vue.js 状态管理Vuex

Vuex是一个状态管理的插件&#xff0c;管理过程包含了state&#xff08;数据源&#xff09;、view&#xff08;state绑定到视图&#xff09;、actions&#xff08;view改变同步改变数据源&#xff09;三个状态&#xff0c;页面刷新的时候vuex里的数据会重新初始化&#xff0c;导…

八. Vue.js数据更新后dom操作-vue.nextTick

Vue响应式并不是数据发生改变后DOM 立即发生改变&#xff0c;而是按一定的策略进行 DOM 的更新&#xff0c;所有当我们改变数据时&#xff0c;立即对改变的DOM处理时就会出错&#xff0c;最明显的就是使用v-if或v-for的时候&#xff0c;针对这种改变数据要对DOM操作&#xff0c…

十四.Vue请求axios

axios是基于Promise 用于浏览器和 nodejs 的 HTTP 客户端&#xff0c;有以下特征&#xff1a; 从浏览器中创建 XMLHttpRequest从 node.js 发出 http 请求支持 Promise API拦截请求和响应转换请求和响应数据取消请求自动转换JSON数据客户端支持防止 CSRF/XSRF axios使用&#x…

elmentui表格修改可点击排序元素

一. 表头排序默认点击表头进行排序&#xff0c;禁止点击表头进行排序&#xff0c;只有点击排序图标的时候再进行排序&#xff0c;添加样式即可&#xff1a; th { pointer-events: none; i { pointer-events: auto; } } 二. 表格点击排序异步请求&#xf…

全局sass变量配置

1. 安装插件 npm install sass-resources-loader --save-dev 2. vue.config.js文件配置 chainWebpack(config) { const oneOfsMap config.module.rule(scss).oneOfs.store oneOfsMap.forEach(item > { item .use(sass-resources-loader) .…

axios传递数组格式参数

1. 安装qs npm install qs 2. 导入qs import qs from qs 3. 配置qs参数处理 &#xff08;方法1&#xff1a;&#xff09;axios拦截 axios.interceptors.request.use(config > { if (config.method get) { config.paramsSerializer function(params) { …

elmentui el-select下拉输入不清空已选值

下拉可创建条目&#xff0c;下拉框获取焦点输入时&#xff0c;已有值被清空 问题图&#xff1a; 处理后图&#xff1a; 方法一&#xff1a; 1. 为了在匹配不到数据时也保留其输入的值&#xff0c;可以用 filter-method 自定义筛选 2. el-select添加上filterable之后&#x…