112.【Vue-细刷-03】(二)

简介: 112.【Vue-细刷-03】

(二十一)、Vue的自定义指令

1.自定义非内嵌指令(不保留h3中的原有text)

  • 自定义的名字前面不加v- ,Vue帮我们自动添加
  • element是一个真实的Dom节点
  • banding是我们绑定的数据
在自定义的指令中的名字,必须全部小写。
//  定义一个全局指令:directive("自定义的名字",function("真实的Dom结点","绑定的数据"))  自定义元素必须全部小写
Vue.directive('text-upper',function(element,banding){
                // 利用真实的Dom结点更改文本,然后绑定的数据进行大写
                element.innerText=banding.value.toUpperCase();
            })
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        两个需求: 
            1.我们通过使用自定义标签v-text-Upper:"实现对文章大写化"
            1.我们通过使用自定义标签v-text-Lower:"实现对文章小写化"
     -->
    <div id="root">
        <h2 v-text-upper="name"></h2>
    </div>
    <script type="text/javascript">
        //  定义一个全局指令:directive("自定义的名字",function("真实的Dom结点","绑定的数据"))  自定义元素必须全部小写
            Vue.directive('text-upper',function(element,banding){
                // 利用真实的Dom结点更改文本,然后绑定的数据进行大写
                element.innerText=banding.value.toUpperCase();
            })
        new Vue({
            el:"#root",
            data:{
                name:"jSxS"
            }
        });
    </script>
</body>
</html>

2.自定义非内嵌指令(保留h3中的原有text)

要使用 += 而不是原来的=
element.innerText += banding.value.toUpperCase();
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        两个需求: 
            1.我们通过使用自定义标签v-text-Upper:"实现对文章大写化"
            1.我们通过使用自定义标签v-text-Lower:"实现对文章小写化"
     -->
    <div id="root">
        <h2 v-text-upper="name">您的名字是:</h2>
    </div>
    <script type="text/javascript">
        //  定义一个全局指令:directive("自定义的名字",function("真实的Dom结点","绑定的数据"))  自定义元素必须全部小写
        Vue.directive('text-upper', function (element, banding) {
            // 利用真实的Dom结点更改文本,然后绑定的数据进行大写
            // element.innerText=banding.value.toUpperCase();
            element.innerText += banding.value.toUpperCase();
        })
        new Vue({
            el: "#root",
            data: {
                name: "jSxS"
            }
        });
    </script>
</body>
</html>

3.自定义非内嵌指令 (非全局)

  • 如果自定义 的标签只有 v-xxx,那么我们只需要在方法前写上 xxx:function(){}即可
  • 如果自定义 的标签只有 v-xxx-xxxx,那么我们只需要在方法前写上 ‘xxx-xxx’:function(){}即可
<h2 v-lower="name">您的小写名字是:</h2>
            directives:{
                lower:function(element,banding){
                    element.innerText += banding.value.toLowerCase();
                }
            }
<h2 v-text-lower="name">您的小写名字是:</h2>
            directives:{
                'text-lower':function(element,banding){
                    element.innerText += banding.value.toLowerCase();
                }
            }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        两个需求: 
            1.我们通过使用自定义标签v-text-Upper:"实现对文章大写化"
            1.我们通过使用自定义标签v-text-Lower:"实现对文章小写化"
     -->
    <div id="root">
        <h2 v-text-upper="name">您的大写名字是:</h2>
        <h2 v-lower="name">您的小写名字是:</h2>
    </div>
    <div id="root2">
        <h2 v-text-upper="name">您的大写名字是:</h2>
        <h2 v-lower="name">您的小写名字是:</h2>
    </div>
    <script type="text/javascript">
        //  定义一个全局指令:directive("自定义的名字",function("真实的Dom结点","绑定的数据"))  自定义元素必须全部小写
        Vue.directive('text-upper', function (element, banding) {
            // 利用真实的Dom结点更改文本,然后绑定的数据进行大写
            // element.innerText=banding.value.toUpperCase();
            element.innerText += banding.value.toUpperCase();
        })
        new Vue({
            el: "#root",
            data: {
                name: "jSxS"
            },
            // 局部自定义指令
            directives:{
                lower:function(element,banding){
                    element.innerText += banding.value.toLowerCase();
                }
            }
        });
        new Vue({
            el: "#root2",
            data: {
                name: "jSxS"
            },
        });
    </script>
</body>
</html>

4.Vue的自定义插件 ⭐

Vue自带的原型数据...

Vue解析不到的数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义插件</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2>{{name}}</h2>
        <h2>{{now}}</h2>
    </div>
    <script>
        Vue.config.productionTip = false  //关闭生产提示
        const vm=new Vue({
            el:'#root',
           data:{
            name:'CKQN'
           }
        });
        vm.$now=new Date();   // xxx这里解析不到数据
    </script>
</body>
</html>

Vue这样的话就能够解析到.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义插件</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2>{{name}}</h2>
        <h2>{{$now}}</h2>
    </div>
    <script>
        Vue.config.productionTip = false  //关闭生产提示
        // 向Vue原型上追加一个$now属性,值为当前的时间。 $now是给实列vm用的。
        Vue.prototype.$now=new Date().toTimeString();  // 这里进行格式化数据...    
        const vm=new Vue({
            el:'#root',
           data:{
            name:'CKQN'
           }
        });
        // vm.$now=new Date();
    </script>
</body>
</html>

插件的正式使用

插件的定义: 插件就是一个包含install方法的对象。

  1. 非插件实列
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义插件</title>
    <script src="../js/vue.js"></script>
    <!-- <script src="../18_插件/atguigu.js"></script> -->
</head>
<body>
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2>{{name}}</h2>
        <h2 v-upper-text="name"></h2>
        <h2 v-lower-text="name"></h2>
        <!-- 调用我们自定义插件种的原型 -->
        <h2>{{$random(2,8)}}</h2>  
    </div>
    <script>
         // 添加两个全局指令
    //  大写
    Vue.directive('upper-text',function(el,bangding){
        el.innerText=bangding.value.toUpperCase();
    })
    //  小写
    Vue.directive('lower-text',function(el,bangding){
        el.innerText=bangding.value.toLowerCase();
    })
    // 给Vue自身添加属性
    Vue.projectName='学生管理系统';
    Vue.MyVersion='v1.0.0'
    Vue.showInfo=function(){
        console.log('我是一些信息');
    };
    // 给Vue原型上添加数据,供vm使用。
    Vue.prototype.$random=function(min,max){
        return Math.random()*(max-min)+min   // TODO (0~1)*6+2
    }
        /*
            插件的定义: 是一个包含install方法的对象,
        */
        Vue.config.productionTip = false  //关闭生产提示   
        // //Vue会帮助我们去调用atguigu 这个插件里面的install方法
        // Vue.use(atguigu)
        console.log(Vue.projectName)
        console.log(Vue.MyVersion)
        Vue.showInfo()
        const vm = new Vue({
            el: '#root',
            data: {
                name: 'CKQN'
            }
        });
    </script>
</body>
</html>

  1. 插件实列
基本方法
1. 需要引入插件的js
<script src="../18_插件/atguigu.js"></script>
2. 使用插件:  Vue.use(插件的名字)
 Vue.use(atguigu)  

atguigu.js

const atguigu={
}
atguigu.install=function(Vue,options){
    // 添加两个全局指令
    //  大写
    Vue.directive('upper-text',function(el,bangding){
        el.innerText=bangding.value.toUpperCase();
    })
    //  小写
    Vue.directive('lower-text',function(el,bangding){
        el.innerText=bangding.value.toLowerCase();
    })
    // 给Vue自身添加属性
    Vue.projectName='学生管理系统';
    Vue.MyVersion='v1.0.0'
    Vue.showInfo=function(){
        console.log('我是一些信息');
    };
    // 给Vue原型上添加数据,供vm使用。
    Vue.prototype.$random=function(min,max){
        return Math.random()*(max-min)+min   // TODO (0~1)*6+2
    }
}

html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义插件</title>
    <script src="../js/vue.js"></script>
    <script src="../18_插件/atguigu.js"></script>
</head>
<body>
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2>{{name}}</h2>
        <h2 v-upper-text="name"></h2>
        <h2 v-lower-text="name"></h2>
        <!-- 调用我们自定义插件种的原型 -->
        <h2>{{$random(2,8)}}</h2>  
    </div>
    <script>
        /*
            插件的定义: 是一个包含install方法的对象,
        */
        Vue.config.productionTip = false  //关闭生产提示   
        //Vue会帮助我们去调用atguigu 这个插件里面的install方法
        Vue.use(atguigu)
        console.log(Vue.projectName)
        console.log(Vue.MyVersion)
        Vue.showInfo()
        const vm = new Vue({
            el: '#root',
            data: {
                name: 'CKQN'
            }
        });
    </script>
</body>
</html>

插件的好处: 可以使用第三方库、降低原有代码的臃肿性,提升代码的简介程度

相关文章
|
3天前
|
JavaScript
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
这篇文章介绍了在Vue项目中如何实现执行删除等危险操作时的二次确认机制,使用Element UI的`el-popconfirm`组件来弹出确认框,确保用户在二次确认后才会执行删除操作。
Vue中如何设置在执行删除等危险操作时给用户提示(二次确认后执行对应的操作)
|
3天前
|
JavaScript
如何创建一个Vue项目(手把手教你)
这篇文章是一篇手把手教读者如何创建Vue项目的教程,包括使用管理员身份打开命令行窗口、找到存放项目的位置、通过vue-cli初始化项目、填写项目信息、进入项目目录、启动项目等步骤,并提供了一些常见第三方库的引入方法。
如何创建一个Vue项目(手把手教你)
|
3天前
|
前端开发
StringBoot+Vue实现游客或用户未登录系统前、可以浏览商品等信息、但是不能购买商品或者加入购物车等操作。登录系统显示用户的登录名(源码+讲解)
这篇文章介绍了使用StringBoot+Vue实现用户登录状态判断的方法,包括前端加载用户信息和后端设置session的源码示例。
|
3天前
|
JavaScript 编译器
成功解决:Module build failed: Error: Vue packages version mismatch
这篇文章记录了解决Vue项目中遇到的"Module build failed: Error: Vue packages version mismatch"错误的步骤,原因是项目中Vue依赖的版本不一致,解决方法是删除`node_modules`后重新安装指定版本的Vue和`vue-template-compiler`,确保版本匹配,最终成功运行项目。
成功解决:Module build failed: Error: Vue packages version mismatch
|
3天前
|
JavaScript
在Vue中使用Avue、配置过程以及实际应用
这篇文章介绍了作者在Vue项目中集成Avue组件库的完整过程,包括安装、配置和实际应用,展示了如何利用Avue实现动态表单和数据展示的功能。
在Vue中使用Avue、配置过程以及实际应用
|
4天前
|
JavaScript
Vue devDependencies 与 dependencies 能别
Vue devDependencies 与 dependencies 能别
10 3
|
3天前
|
JavaScript
如何在Vue页面中引入img下的图片作为背景图。../的使用
这篇文章介绍了在Vue页面中如何引入`img`目录下的图片作为背景图,提供了两种使用相对路径的方法。第一种是使用`../assets/img/`作为路径引入图片,第二种是使用`../../assets/img/`作为路径。文章还展示了使用这些方法的代码实现和效果展示,并鼓励读者学无止境。
如何在Vue页面中引入img下的图片作为背景图。../的使用
|
3天前
|
JavaScript
如何通过点击商品的信息(图片或者文字)跳转到更加详细的商品信息介绍(前后端分离之Vue实现)
该博客文章介绍了如何在Vue 2框架下实现前后端分离的商品信息展示和详情页跳转,包括排序筛选、详情展示、加入购物车和分享功能。
如何通过点击商品的信息(图片或者文字)跳转到更加详细的商品信息介绍(前后端分离之Vue实现)
|
3天前
|
JavaScript
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件
这篇文章介绍了在Vue中如何使用Swiper插件创建轮播图,解决Swiper左右切换按钮不生效的问题,并展示了如何将Swiper轮播图抽离成一个可复用的公共组件,同时提供了详细的安装、配置和优化建议。
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件
|
3天前
|
JavaScript
Vue学习之--------插槽【默认插槽、具名插槽、作用域插槽】
这篇文章详细介绍了Vue.js中的插槽概念,包括默认插槽、具名插槽和作用域插槽的使用方式和实际应用示例,通过代码演示了如何在组件中定义和使用插槽来实现内容的灵活替换和展示。
Vue学习之--------插槽【默认插槽、具名插槽、作用域插槽】