前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue第二天

Vue第二天

作者头像
生南星
发布2019-07-22 14:29:22
2740
发布2019-07-22 14:29:22
举报
文章被收录于专栏:生南星生南星

一, 自定义指令

使用场景: 当需要对普通的DOM元素进行底层的操作时可以考虑使用自定义指令实现. 自定义指令分两种:

1.全局自定义指令 在不同的vue实例的有效范围内都能使用

语法: Vue.directive(指令名,对象);

使用指令名时,名字前面加 v- 指令名如果有大写字母,在使用该指令时,需要在每个大写字母的前面加 - ,也可以把大写字母替换成小写字母,同样要在其前面加 - .

当自定义指令里只有bind和update两个函数,不再有其他函数时,可以对自定义指令的代码进行精简.

代码语言:javascript
复制
//body
<div id="app">
   <h2 v-changebgc="bgc">这是app的h2标签</h2>
   <p v-changebgc="bgc1">这是app的p标签</p>
</

//script
Vue.directive('changebgc',function (el,binding) {
    el.onmouseenter=function () {
         this.style.backgroundColor=binding.value.e;
     };
     el.onmouseleave=function () {
          this.style.backgroundColor=binding.value.l
     };
 });
 
 let app = new Vue({
     el:'#app',
     data:{
        enterBgc:'blue',
        bgc:{
            e:'pink',
            l:'yellow'
         },
        bgc1:{
            e:'blue',
            l:'red'
        }
     },
 });

2.局部自定义指令 只在其声明自定义指令的vue实例内起作用

代码语言:javascript
复制
let app = new Vue({
     el:'#app',
     directives:{
       unif:{
          bind(el, binding){
          console.log('unif的bind函数触发',el, binding);
       },
 });

二, 自定义过滤器

自定义过滤器: 对数据进行过滤 vue2.0版本不再提供系统的过滤器,如果想要使用过滤器,只有自定义 过滤器分两种: 1.全局过滤器 语法: Vue.filter('过滤器名字',回调函数); 函数的参数: 第一个参数: 过滤器 | 前面的值 第二个参数往后: 过滤需要的参数

代码语言:javascript
复制
<div id="app">
    <h2>{{100.23434 | currency('$', 2)}}</h2>
</div>

Vue.filter('currency', function (value, flag, count) {
    console.log(value, flag, count);
    return flag+value.toFixed(count);
});

2.局部过滤器

代码语言:javascript
复制
<div id="app">
    <h2>{{'hello' | capital}}</h2>
</div>

let app = new Vue({
     el:'#app',
     filters:{
        capital:function (value) {
            return value[0].toUpperCase()+value.substr(1);
         }
      }
 });

三, 计算属性

计算属性是vue的特性, 计算属性与普通的函数调用的区别: 1.如果把解决问题的代码写进methods函数里并且在并且里直接调用,功能可以实现;但是因为直接把函数的调用代码写到的标签里,导致vue因为Model的变化刷新View时,标签里写的所有函数调用都会触发一次,不管当前的操作是否与该函数有关,有可能导致函数结果计算错误,也会让效率降低. 2.计算属性是基于对应数据的依赖进行缓存的. 写到计算属性里的代码只会在其关联的数据发生改变时才会触发. 计算属性写成对象: 1.可以选择性的对外暴露get或者set方法,保证数据的安全 2.可以在外界请求之后,对数据里的敏感项做过滤,保证外界拿到的数据没有威胁

代码语言:javascript
复制
<div id="app">
   <p @click="name='琳'">{{name}}</p>
</div>

let app = new Vue({
     el:'#app',
      computed:{
          //name是属性
          name:{
              //获取 name计算属性的值
              get(){
                 return this.personName;
              },
              //设置 name计算属性的值
               set(newName){
                  this.personName=newName;
                },
          }
     }
 });

si

四, 值监测

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>值监测</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <input type="text" v-model="v">
    </div>
    <script type="text/javascript">
        let app = new Vue({
            el:'#app',
            data:{
                v:'',
            },
            methods:{},
            watch:{
                v:function (newVal, oldVal) {
                    console.log(newVal, oldVal);
                }
                //watch都能检测那些数据类型的数据?
            }
        });
</script>
</body>
</html>

五, 组件创建

Vue里的组件分两种: 1.全局组件

语法: Vue.component('组件名',对象);

代码语言:javascript
复制
//第一种创建全局组件的方式:
<div id="app">
    <my-header></my-header>
</div>

Vue.component("my-header",{
           //指定组件的模板结构
           template: `
                <div>
                    <h2>这是my-header组件的标题</h2>
                    <div>
                        <a href="#">选项一</a>
                        <a href="#">选项二</a>
                        <a href="#">选项三</a>
                    </div>
                </div>
           `
        });
代码语言:javascript
复制
//第二种创建全局组件的方式:
<div id="app">
    <my-content></my-content>
</div>

<template id="myContent">
        <div>
            <h2>这是myContent组件的标题</h2>
            <section>这是myContent组件的内容区域</section>
        </div>
</template>

Vue.component("my-content",{
    template: '#myContent'
});

2.局部组件

代码语言:javascript
复制
//body
<div id="app">
        <my-news></my-news>
        <my-music></my-music>
</div

<template id="myMusic">
        <div>
            <span>请输入留言:</span>
            <textarea></textarea>
        </div>
</template>

//script
let app =new Vue({
  el:'#app',
  components:{
  //第一种创建局部组件的方式:
                "my-news":{
                    template:`
                        <ul>
                            <li>热点</li>
                            <li>娱乐</li>
                            <li>音乐</li>
                            <li>政治</li>
                            <li>历史</li>
                        </ul>
                    `
                },
                
                //第二种创建局部组件的方式:
                "my-music":{
                    template:'#myMusic'
                }
            }
});

注意:--组件名的命名规则: 1.不要与系统的标签名重名 2.推荐使w3c的命名规则: 小写单词-小写单词 my-header 3.支持驼峰命名,但是使用的时候还是单词首字母小写,中间加 -

六, 组件详解

* 自定义组件的data必须是一个函数

组件的data数据源要求写成函数,并且返回的是一个对象,这么写考虑到组件的复用,当复用时,各个复用组件都用各自的data对象,数据之间不发生干扰.

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件详解</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <child1></child1>
    </div>
    <template id="child1">
        <div>
            <h2>这是child1组件</h2>
            <p>{{msg}}</p>
            <button @click="btnClick">点击事件</button>
            <p>{{message}}</p>
        </div>
    </template>
    <script type="text/javascript">
        let child1 = {
          template:'#child1',
            //组件的data数据源要求写成函数,并且返回的是一个对象,这么写考虑到组件的复用,当复用时,各个复用组件都用各自的data对象,数据之间不发生干扰.
            data(){
              return {msg:'就算这样,也要笑着去努力啊.'}
            },
            methods:{
                btnClick(){
                    alert('child1');
                }
            },
            computed:{
              message:{
                  get(){
                      return "Hello! "+this.msg;
                  }
              }
            }
        };
        let app = new Vue({
           el:'#app',
            components:{
               "child1":child1
            }
        });
</script>
</body>
</html>

用到的小知识 :

  1. 如果需要获取绑定指令元素的父元素,需要使用inserted函数
代码语言:javascript
复制
inserted(el, binding){
  console.log(el, el.parentElement,binding);
}

2. toUpperCase() 方法用于把字符串转换为大写。 3. substr(start,length) 方法可在字符串中抽取从 start 下标开始的指定数目的字符。

4. toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。

5. watch都能检测那些数据类型的数据?

watch是什么? -- watch是一个json,每一个json的键名就是监测的data中的数据,键值是一个function,第一个参数是新数据,第二个参数是旧数据。

vue内部不同变量类型的watch

1.普通变量(number, string..)

代码语言:javascript
复制
watch:{
//注意不用箭头函数,理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例
  data:function(){        
        console.log("改变");
    }
},

2. 数组

数组改变时建议用原生操作数据的方式进行改变,比如push之类。

deep -- 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。

代码语言:javascript
复制
return array=[1,2,3];
array2:{ handler(newValue, oldValue) { console.log(newValue) }, deep: true },

3. 对象

代码语言:javascript
复制
return obj1 = {
    label:1,
    value:2
}
obj1.label=2;

watch:{
    obj1:{
        handler(newValue, oldValue) {
            console.log(newValue)
        },
        deep:true    //深拷贝
    }
}
//如果要检测某一个特定属性的改变,可以用computed
computed: {
    value() {
        return this.obj1.value
    }
},


watch:{  
value(newValue, oldValue) {
    console.log(newValue,oldValue)
},

详情见: vue中watch的详细用法

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生南星 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档