博客

  • Vue计算属性的setter和getter

    计算属性的setter和getter

    get 传入值

    set接收外部传来的value

    插值表达式的内容,先去data对象中去找,找不到就会去computed对象中去找,找到显示到页面上

    <div id="app">{{fullName}}</div>
    var vm = new Vue({
    el:"#app",
    data:{
    firstName:"Dell"
    lastName:"Lee"
    },
    computed:{
        fullName:{
        get:function() {
            return this.firstName + " " + this.lastName
        },
        set:function(value) {//通过设置一个值来改变它相关联的值
        var arr = value.splice(" ");
        this.firstName = arr[0];
        this.lastName = arr[1];
        }
        }
    }
    })

    原理:computed依赖的变量发生变化,它会重新计算

    this.firstName值在set中发生了变化,而this.firstName又是get中computed依赖的值,因此会重新计算,DOM发生变化

  • Vue样式绑定的方法

    样式绑定的方法
    1)通过class绑定
    class的对象绑定 ::class="{ activated:isActivated}",根据isActivated的true或false决定dom是否有class="activated"属性
    对象绑定有另一种写法::class="activated",在vue实例的data中定义绑定的对象activated:{ isActivated:true}
    2)class的数组绑定:class="[activated]",vue实例的data中activated的值即为class的值,数组内表示变量,数组内可填写多个变量

    使用内联样式     
    3)style的对象绑定

    <div :style="styleObj" @click="handleDivClick">Hello world</div>
    data:{
    styleObj:{
    color:"black"
    }
    },
    methods:{
    handleDivClick:function() {
    this.styleObj.color = this.styleObj.color === "black" ? "red" : "black";
    }
    }

    4)style的数组绑定

    <div :style="[styleObj,{fontSize:'20px'}]" @click = "handleDivClick">hello world</div>
    data:{
    styleObj:{
    color:"black"
    }
    },
    methods:{
    handleDivClick:function() {
    this.styleObj.color = this.styleObj.color === "black" ? "red" : "black"
    }
    }
  • Vue中的条件渲染

    Vue中的条件渲染

     v-if和v-show都能一个模板标签是否能在页面显示。

    显示时:相同

    隐藏时:

    v-if:不存在与dom之上

    v-show:存在dom之上,以display:none的形式隐藏

    v-show不会频繁的把dom从页面上删除或者添加。因此需要频繁的切换使用v-show效率更高。

    v-if会在dom页面上添加或者删除。如果运行条件很少改变使用v-if更好

    注意,v-show 不支持 <template> 元素,也不支持 v-else。

    a除了v-if还有v-else。v-if和v-else要紧贴着使用

    除了v-if和v-else还有v-else-if,也需要连在一起

             vue重新渲染时会尽量复用界面上存在的dom,因此下图的用户名切换到邮箱名的时候input的值不会变。因为在切换后vue发现以前的页面有一个input就复用了。

    为了解决这个问题可以采用key值的方式。

    不复用vue元素的方法:

    当dom有key值时,vue会知道是页面上唯一的元素。如果两个dom的key值不一样,vue不会选择复用,会重新渲染。

  • Vue列表渲染

    Vue列表渲染

    1. for-in和for-of推荐使用for-of

    2. v-for循环key推荐用数据的key值

    数组变更方法

    1. 使用vue数组方法变更

    在vue的for循环中直接改变数组的值,不能引起页面的一起变化。需要使用vue数组的方法

    2.改变引用

    重新给绑定一个新的list,给一个新的引用地址

    数组循环中可以使用template占位符标签

    使用templete的好处是最终的渲染结果将不包含 <template> 元素。

    对象的循环

    可以在for-in中用key去获取对象中的键值 

    对象循环增删键值只能改变对象的引用

    1.页面实时响应的效果应该使用数组的方法

    采用vue提供的数组变异方法改变数组,才能实现数据变化(7个)

    pop: 删除数组最后一项

    push:在数组末尾添加元素

    shift: 把数组第一项删除

    unshift:往数组第一项加内容

    splice:数组截取 向/从数组添加/删除项目,并返回删除的项目。这种方法会改变原始数组。

    vm.list.splice(index,howmany,item1,...,itemX) 
    //(指定位置,要删除的项目数,要添加在数组中的新项目)

    sort:对数组进行排序

    reverse:翻转数组(数组取反)

    2.通过改变数据的引用地址

    list=[] 将list引用给一个另外的数组

    vm.list = [{
            id: "012311"
            text: "Bye"
        }, {
            id: "012313"
            text: "Dell"
        }]

    template模板占位符 不会渲染到页面上,可以用于包裹元素

    把对象的内容循环展示到页面上

    <div v-for="(item,key,index) of userInfo">{{item}} --- {{key}} -- {{index}}</div>

    key: 对象的键名

    item:对象的键值

    index:对象的位置信息

    修改原有数据并渲染到页面上 vm.userInfo.name = "Mike Lee"

    新增数据并渲染到页面上 修改对象的引用值 userInfo = {}

    vm.userInfo = {
            name: "Dell",
            age: 28,
            gender: "male",
            salary: "secret",
            address: "beijing"
            }
        }
  • Vue中set的方法

    Vue中set的方法

    vue对象修改方法

    1. 修改引用

    2. 使用vue的set方法

    对象可以使用set的方法添加键值对

    Vue.set(vm.userInfo,"address","beijing")

    vm.$set(vm.userInfo,"address","beijing")

    vue数组修改方法

    1. 变异方法 splice等

    2. 改变引用

    3. set方法

      Vue.set(vm.userInfo,1,5)

      vm.$set(vm.userInfo,1,5)

  • Vue事件绑定的两种写法

    Vue事件绑定的两种写法
    1. @click="handleClick"

      传递默认传递事件绑定对象

    2. @click="handleClick($event,参数1,参数2)" 

      $event:vue内置事件绑定

      可以传递多个对象

    Vue事件修饰

    1. @click.prevent:阻止事件的默认行为

    2. @click.self: (阻止事件冒泡)点击本身dom才会触发事件   (.self要求,click事件只有在e.target=e.currentTarget的时候才会执行)

    3. @click.once:只触发一次

    4. @click.capture:按照捕获事件顺序执行(从外部到内部)

    5. @click.stop 阻止事件冒泡

    按键修饰符

    @ketdown.enter:只有enter这个键会被监听到

    系统修饰符

    @keydown.ctrl/shift/alt/meta :按住ctrl等系统修饰符,当按住了@keydown才会执行

    鼠标修饰符

    @click.right/left/middle: 如:.right鼠标右键点击的时候才会执行

  • Vue中的表单绑定

    Vue中的表单绑定

    通过v-model实现vue表单的双向绑定。

    1.input

    2.textarea

    3.checkbox

    4.radio

    5.select

    v-model在select中

    如果有value的值指向value的值 =‘1’

    如果没有value指向对应的inner-text = A

    v-model修饰符

    v-model.lazy:懒加载,只在失去焦点时加载。

    v-model.number:读取input的值,如果值能转换成number,转换成number保存在value中。

    v-model.trim:去除首尾空格

  • Vue 学习总结1

    <!–总结–>
    1、 v-on: => @
    2、 v-bind:content => :content
    3、 v-model 数据双向绑定
    4、 全局组件 Vue.components("组件名(驼峰命名)", {})创建
    5、 局部组件 var TodoItem = {}, 需要在父组件中用
    components: {
    TodoItem: TodoItem
    }注册, 只有注册后才有效
    6、 mvc模式主要在c, 面向dom, 主要是dom操作
    7、 mvvm面向数据

    8.父子组件传值
    父–>子 通过v-bind:变量名来实现传值,子组件通过props属性接收父组件传的值
    子–>父 通过this.$emit("事件名", "参数")向上一层触发事件,父组件通过@事件名来监听事件并接收子页面传递的参数

    ​9.splice():从数组中添加或者删除项目,然后返回被删除的项目

     

    附录:

    Vue内部提供全局组件方法:

    <todo-item v-for="item in list"></todo-item>
    Vue.component("命名", {
        template: "<li>todo Item</li>"
    })

    向子组件传递绑定内容:v-bind: content="item"

    循环list时,将list每个值赋值给item

    <todo-item v-for="item in list"></todo-item>

    将item值通过v-bind传给<todo-item>,通过content变量传递

    <todo-item v-bind="content"></todo-item>

    子组件从父组件接收内容:props: [‘content’]

    局部组件:

    定义对象TodoItem:

    var TodoItem = {
        props: [‘content’],
        template: "<li>{{content}}</li>"
    }

    将TodoItem组件注册到根Vue实例中:

    components: {
        TodoItem: TodoItem
    }

  • SQL函数Group_concat用法

    语法
    group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])
     

    示例:

    $data = db('user_card')
        ->where('status', '<>', 9)
        ->group('phone')
        ->field('id,name,phone,store_id,unionid,GROUP_CONCAT(store_id) store_ids')
        ->select()->toArray();
  • 常用的正则表达式

    一、校验数字的表达式

    • 数字:^[0-9]*$
    • n位的数字:^\d{n}$
    • 至少n位的数字:^\d{n,}$
    • m-n位的数字:^\d{m,n}$
    • 零和非零开头的数字:^(0|[1-9][0-9]*)$
    • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
    • 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$
    • 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
    • 有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$
    • 有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$
    • 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
    • 非零的负整数:^\-[1-9][]0-9″*$ 或 ^-[1-9]\d*$
    • 非负整数:^\d+$ 或 ^[1-9]\d*|0$
    • 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
    • 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
    • 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
    • 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
    • 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
    • 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

    二、校验字符的表达式

    • 汉字:^[\u4e00-\u9fa5]{0,}$
    • 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
    • 长度为3-20的所有字符:^.{3,20}$
    • 由26个英文字母组成的字符串:^[A-Za-z]+$
    • 由26个大写英文字母组成的字符串:^[A-Z]+$
    • 由26个小写英文字母组成的字符串:^[a-z]+$
    • 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
    • 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
    • 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
    • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
    • 可以输入含有^%&',;=?$\"等字符:[^%&’,;=?$\x22]+
    • 禁止输入含有~的字符:[^~\x22]+

    三、特殊需求表达式

    • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
    • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
    • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
    • 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
    • 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
    • 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
    • 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
    • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
    • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
    • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
    • 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
    • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
    • 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
    • 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
    • 钱的输入格式:

       

      1. 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
      2. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
      3. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
      4. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
      5. 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
      6. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
      7. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
      8. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
      9. 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
    • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
    • 中文字符的正则表达式:[\u4e00-\u9fa5]
    • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
    • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
    • HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
    • 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
    • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
    • IPv4地址:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}