• vue知识点


    2.使用

    // 1.下载
    npm install vue --save:vue核心文件
    // 注意:下面两个不是必须,需要就下载
    npm install vue-resource --save:vue资源文件-ajax
    npm install vue-router --save:vue路由
    
    // 2.页面内使用
    // HTML代码
    <div id="box"></div>
    
    // JS代码
    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
    // 实例化Vue对象(可以有多个实例,但是不推荐)
    new Vue({
        // 指定Vue作用范围
        el: "#box"
    })
    </script>
    
    注意事项:
    1.Vue的内容都必须在在el属性值表示的标签范围内
    2.一个页面中可以有多个vue实例,但是以后网页都是单页面,推荐写一个vue实例
    3.不要将el设置为html和body
    

    3.{{}}使用-数据输出

    // Mustache语法
    // 数据msg改变,插值内容将会更新
    <span>message:{{msg}}</span>
    
    // 只绑定一次
    <span v-once>{{msg}}</span>
    
    {{'hello world'}}:纯字符串
    {{4*8}}:数字运算表达式
    {{ num }}:变量(数据模型)
    {{ num*price }}:变量(数据模型)运算
    {{ boolean ? 'yes' : 'no' }}:三元运算符
    {{data.join('->')}}:数组拼接
        data=[1,2,3,4] 1->2->3->4
    {{ msg.split('').reverse().join('') }}:字符串反转处理
    
    // JS代码
    new Vue({
        el:"#box",
        data:{
            msg:"Hello world",
            num:8,
            price:3.99,
            boolean:true,
            data:['zhangsan','lisi','wangwu']
        }
    })
    

    2.指令

    指令里的字符都是变量
    v-model="red"  //此时red是变量,如果想输出red字符串,需要给red加引号v-model="'red'"
    

    2.0 v-text:绑定文本

    <span v-text="msg"></span>
    等价于 <span>{{msg}}</span>
    

    2.1 v-bind:绑定属性

    // **下面写法 img数据不能解析
    <img src="{{img}}">
    
    // **v-bind绑定(此处“”内的img,title都是模型数据)
    <img v-bind:src="img" alt="" v-bind:title="title">
    
    // button按钮
    <button v-bind:disabled="false">Button</button>:启用按钮
    <button v-bind:disabled="true">Button</button>:禁用按钮
    
    // 绑定自定义data属性
    <h3 v-bind:data="msg">绑定自定义属性-绑定模型</h3>
    
    // v-bind内容做字符串和变量值拼接
    <div v-bind:title="'list-'+id"></div>
    
    // **简写
    <img :src="img" :title="title">
    

    2.2 v-html

    // 问题:{{}}只可以解释纯文本,写标签原形输出
    
    // 解决办法:v-html绑定html标签内容输出
    <div v-html="model"></div>
    
    注意:
            1.内部的数据绑定会被忽略
            2.只对可信内容使用HTML插值,绝不要对用户提供内容插值,防止XSS攻击
    

    2.3 v-model

    <input type="text" v-model="message">
    // v-model定义的message模型改变,h3内的{{message}}同步更新
    <h3>{{message}}</h3>
    
    注意:v-model定义的数据必须在data中定义
    

    2.4 **v-if

    // bool=true=>显示
    // bool=false=>不显示
    <h3 v-if="model">显示与不显示</h3>
    
    // template:模板-views
    <template v-if="ok">
      <h1>Title</h1>
      <p>Paragraph 1</p>
      <p>Paragraph 2</p>
    </template>
    
    
    v-if 满足条件则显示
    不满足条件隐藏
    v-else-if
    必须和前面的v-if结合使用
    v-else
    当以上条件都不满足时,触发,只和最近的的v-if 或者是v-else-if搭配使用
    

    2.5 v-for

    **普通遍历
    <ol>
        <li v-for="todo in todos">
        {{ todo.text }}
        </li>
    </ol>
    
    **数组遍历 value为值,key为索引
    <div v-for="(value, key) in object">
      {{ key }} : {{ value }}
    </div>
    
    // 普通0-10循环
    <span v-for="n in 10">{{ n }}</span>
    
    // 模版遍历
    <ul>
      <template v-for="item in items">
        <li>{{ item.msg }}</li>
        <li class="divider"></li>
      </template>
    </ul>
    

    2.6 v-show

    // v-show="boolean"
    <p v-show="boolean">v-show指令</p>
    

    2.6.1 v-if和v-show区别

    与v-if区别:
        v-if:是vue在编译的时候,v-if="false"直接不会显示对应的代码,代码以注释形式存在浏览器中,并且不显示,只显示<!---->
        v-show:v-show="false"仅仅是隐藏对应的代码
    
    *********************
    还有一个区别
    <div v-show="isShow">
    	<video></video>
    </div>
    如果是v-show 即使退出这个div不显示了,视频仍然播放着,只不过在页面不显示,视频依然有声音
    但是v-for就可以退出视频了
    

    2.7 绑定事件:v-on

    绑定多个事件

    @mousedown="dragShow();moveShow()"
    
    jquery阻止事件冒泡
        1.return false
        2.e.stopPropagation()
    jQuery阻止默认行为
        1.return false
        2.e.preventDefault()
    
    js中阻止事件冒泡
        1.var e = ent || window.event;
            e.cancelBubble = true
        2.e.stopPropagation();
    
        注意啦:在JS中不能使用return false阻止事件冒泡
    JS中阻止默认行为
        1.e.preventDefault();
        2.return false;
    <button v-on:click="show">点击</button>
    // 简写事件格式
    <button :click="show($event)"></button>
    
    // 事件属性
    new Vue({
        el:'',
        methods:function(e){
            e.cancelBubble = true;  // 阻止事件冒泡
            e.preventDefault(); // 阻止默认行为
            e.clientX/e.clientY // 鼠标事件属性
            e.keyCode   // 键盘事件属性
        }
    })
    
    // 阻止事件冒泡方法2
    @click.stop="show()"
    @click.prevent="show()"
    
    // 键盘事件特殊用法
    @keyup.13="show()"
    @keyup.enter/tab/delete/esc/space="show()"
    @keyup.left/up/right/down="show()"
    
    // 等价于@keyup.13="show()"
    show:function(ev){
        if (ev == 13) {
            alert('您按回车了')
        }
    }
    
    // 拖拽事件可以直接被使用
    

    2.8 自定义指令

    // 为什么用自定义指令(举例子)
    Vue2.0中,代码复用的主要形式和抽象是组件,然后,有的情况下,你仍然需要对纯DOM元素进行底层操作,这就需要自定义指令
    
    // 注册一个全局自定义指令 v-demo="color"
    Vue.directive('demo', function(el, binding) {
        // el:绑定的元素
        // binding.value:绑定的值
        el.style.backgroundColor = binding.value;
    })
    
    // 实例化Vue对象
    new Vue({
        el: '#box',
        data: {
            color: "yellow"
        }
    })
    

    2.9区别

    v-if和v-show的区别
    v-if 是通过控制元素节点是否存在,控制元素的显示与隐藏
    v-show 是通过控制元素的style.display 控制元素的显示与隐藏
    
    v-html和v-text的区别
    v-html 支持解析HTML标签
    v-text 不支持解析HTML标签,将HTML标签全部以实体字符的形式显示,也就是标签原样输出
    

    3.计算属性

    任何复杂的逻辑运算,使用计算属性

    // HTML标签代码
    <div id="box">
        <input type="text" v-model="num1">
        <div>{{num1}}</div>
        <div>{{num2}}</div>
        <div>{{getNum2()}}</div>
        <div>{{fullName}}</div>
        <!-- 使用对象添加class对象 -->
        <div v-bind:class="classObject">Hello world</div>
    </div>
    
    //实例化Vue
    var app = new Vue({
        el: '#box',
        data: {
            price: 0,
            num: 0,
            message: "hello world"
        },
        // 只讲计算属性,方法放在简书案例中即可
        computed: {
            // 计算属性不能出现在data数据中
            total: function() {
                console.log(this.price);
                return this.price * this.num;
            },
            // 随时跟着message进行相应的变换
            reverse: function() {
                return this.message.split('').reverse().join('');
            }
        }
    })
    
    注意:
    1.计算属性(computed)和方法(methods)都可以修改数据,但是计算属性依赖缓存提升效率,方法调用不会依赖缓存
    2.观察对象watchers:当你想要在数据变化响应时,执行异步操作或昂贵操作时,这是很有用的(官方demo-尝试做一个ajax的例子)
    

    4.过滤器

    //过滤器
        Vue.filter('number', function(value) {
            // 转换为浮点数
            var num = parseFloat(value);
    
            // 保留两位小数点
            return num.toFixed(2);
        })
    
        // 格式化日期
        Vue.filter('date', function(input) {
            // 将个位数加前置0
            function toZero(value) {
                console.log(value);
                if (value <= 9) return '0' + value;
                else return value;
            }
    
            var oDate = new Date(input);
            return oDate.getFullYear() + '-' + toZero((oDate.getMonth() + 1)) + '-' + toZero(oDate.getDate()) + ' ' + toZero(oDate.getHours()) + ':' + toZero(oDate.getMinutes()) + ':' + toZero(oDate.getSeconds());
        });
    

    5.表单控件绑定

    6.Class与Style绑定

    // HTML标签代码
    // class绑定
        <h3>1.:class="model"</h3>
        <div :class="className">:class="model"</div>
        <h3>2:class="{className:bool}"</h3>
        <div :class="{red:bool}">:class="{className:bool}"</div>
        <h3>3:class="arr"</h3>
        <div :class="['red','fs']">3:class="object"</div>    
    
    // style样式绑定
        <!-- 1.直接绑定样式 -->
        <div :style="{'100px',height:'100px',background:'red'}"></div>
        <!-- 2.直接绑定模型 -->
        <div :style="style"></div>
        <!-- 3.绑定数组 -->
        <div :style="styleArr"></div></div>
    
    //实例化Vue
    new Vue({
            el: '#box',
            data: {
                style:{
                    '150px',
                    height:'150px',
                    background:'#ddd'
                },
                styleArr:[
                    {'200px',height:'200px'},
                    {background:"blue"}
                ],
                '50px'
            }
        })
    

    3.created 实例化 mounted 挂载

    		created:function () {
               console.log('vue实例化');
            },
            mounted:function () {
                console.log('vue挂载');
            }
            
     // 无论先写挂载,还是实例化,首先执行实例化,其次执行挂载
    

    4.组件

    |注意:template:里的内容必须是一个标签,不能直接输出文本,如果需要输出多个标签,需要用一个标签在外进行包裹

    组件:具有某个相对独立的功能的模块,
    应用:一般由一个或多个组件进行组成
    web开发的应用,SPA 单页面应用,只有一个页面
    

    4.1全局组件

    <div id="app">
        <div class="show">
            <!--显示的组件-->
            <my></my>
            <!--引入第二个组件-->
            <two></two>
        </div>
    </div>
    <script src="../dist/vue.js"></script>
    <script>
        // 全局组件   
        Vue.component('my', {  // my自定的组件名
            // template 模板 组件中有且只有一个标签,作为最外侧的容器,不能直接输出文本
            template: `
                <div>
                    <h3>我是h3</h3>
                    <h4>我是h4</h4>
                </div>
            `
        })
    </script>
    

    4.2局部组件(子组件)

        Vue.component('two',{
            template:`
                <div>
                    我是第二个组件,我要引用第一个组件
                    <my></my>
                    <child></child>
                </div>
            `,
    //        子组件,局部组件
            components:{
                'child':{
                    template:'<h3>我是一个局部组件</h3>'
                }
            }
        })
        new Vue({
            el: '#app',
        })
    

    5.路由router

    路由:约定好的一种特定的访问方式!
    直接引入vue-router.js文件
    下载:npm install vue-resource --save:vue资源文件-ajax
    	npm install vue-router --save:vue路由
    JS操作:
    	1.创建组件
    	2.约定路由规则,指定组件
    	3.创建路由实例
    	4.挂载路由
    	
    HTML操作:
    	1.设置路由链接
    	2.设置路由组件显示的区域
    
    <body>
    <div id="app">
        <span>
        // <router-link>类似a链接,固定写法
            <router-link to="/index1">首页</router-link>
            <router-link to="/me1">我的</router-link>
        </span>
        <div class="content">
            <router-view></router-view>
        </div>
    </div>
    <script src="../dist/vue.js"></script>
    <script src="../dist/vue-router.js"></script>
    <script>
    //    创建组件
        const index = {
            template:`
                <div>
                    <p>首页组件</p>
                    <ul v-for="(item,index) in goods">
                    <li>{{index+1}}</li>
                    <li>{{item.title}}</li>
                    <li>{{item.price}}</li>
                    </ul>
                </div>
    
                `,
                // 路由里data必须是一个函数
            data:function () {
                return {
                    goods:[
                        {title:'可乐',price:2.50},
                        {title:'雪碧',price:2.50},
                        {title:'橙汁',price:2.50}
                    ]
                }
            }
        };
        const me = {
            template:'<p>我的组件</p>'
        };
    //   约定路由规则,指定组件
        const routes = [
            {
                path:"/index1",
                component:index
            },
            {
                path:'/me1',
                component:me
            },
            {
                path:'/*', 
                // 重定向
                redirect:index
            }
        ];
    //    创建路由实例
        const router = new VueRouter({
            routes:routes
        });
        new Vue({
            el:'#app',
    //        挂载路由
            router:router
        })
    
    </script>
    

    6.vue-cli vue-router vue-loader

    vue-cli相当于脚手架 给你自动生成模板工程
    vue-router是 vue路由插件 支持你单页应用的
    vue-loader是webpack加载器,webpack下loader插件 可以把.vue文件转换为js模块
    

    7.vue-loader

    vue-loader是webpack加载器,webpack下loader插件 可以把.vue文件转换为js模块,这其中最最值得关注的是,它生成了 render function 
    coderender function code 是从模板编译而来(可以并且应该预编译)的组件核心渲染方法,在每一次组件的 Render 过程中,通过注入的数据执行可生成虚拟 Dom
    <template>
        ...
    </template>
    <script>
        ...
    </script>
    <style>
        ...
    </style>
    

    8.vue-draggable 插件拖拽

    npm install vuedraggable -D
    // 引入拖拽插件
    import Draggable from 'vuedraggable'
    挂载组件
    components: {
        Draggable
      },
    应用组件
        <draggable v-model="tags" :move="getdata" @update="datadragEnd">
          <h3>是什么爱国讲述了过了我个我</h3>
          <transition-group>
            <div v-for="element in tags" :key="element.id">拖啊拖啊他拖他就哦啊图爱过几个;啊 {{element.name}}</div>
          </transition-group>
        </draggable>
    

    9.v-touch 插件移动端触摸拖拽

    下载cnpm install vue-touch@next   
    	@next 下一个版本号,不写的话下载的是vue1.0的,写上下载1.0的下一个2.0
    实例化
    let vueTouch = require('vue-touch')
    Vue.use(vueTouch, {name: 'v-touch'})
    
    <!-- tab渲染一个标签,默认渲染div panright向右滑动-->
    如果需要绑定多个 滑动,就直接写
    <v-touch  tag="div" v-on:panright="moveRight" v-on:panleft="moveLeft"></v-touch>
    
    moveRight 和moveLeft 是定义的一个方法,在methods中写
    
    
    
    因为vue-touch其实封装了 hammer.js的方法 其实我们这里介绍的也就是他几个事件;详情可以搜索 hammer.js的文档;
    hammer.js主要针对触屏的6大事件进行监听。如下图所示:
    
    1、  Pan事件:在指定的dom区域内,一个手指放下并移动事件,即触屏中的拖动事件。这个事件在屏触开发中比较常用,如:左拖动、右拖动等,如手要上使用QQ时向右滑动出现功能菜单的效果。该事件还可以分别对以下事件进行监听并处理:
    
    Panstart:拖动开始、Panmove:拖动过程、Panend:拖动结束、Pancancel:拖动取消、Panleft:向左拖动、Panright:向右拖动、Panup:向上拖动、Pandown:向下拖动
    
    2、  Pinch事件:在指定的dom区域内,两个手指(默认为两个手指,多指触控需要单独设置)或多个手指相对(越来越近)移动或相向(越来越远)移动时事件。该事件事以分别对以下事件进行监听并处理:
    
    Pinchstart:多点触控开始、Pinchmove:多点触控过程、Pinchend:多点触控结束、Pinchcancel:多点触控取消、Pinchin:多点触控时两手指距离越来越近、Pinchout:多点触控时两手指距离越来越远
    
    3、  Press事件:在指定的dom区域内触屏版本的点击事件,这个事件相当于PC端的Click事件,该不能包含任何的移动,最小按压时间为500毫秒,常用于我们在手机上用的“复制、粘贴”等功能。该事件分别对以下事件进行监听并处理:
    
    Pressup:点击事件离开时触发
    
    4、  Rotate事件:在指定的dom区域内,当两个手指或更多手指成圆型旋转时触发(就像两个手指拧螺丝一样)。该事件分别对以下事件进行监听并处理:
    
    Rotatestart:旋转开始、Rotatemove:旋转过程、Rotateend:旋转结束、Rotatecancel:旋转取消
    
    5、  Swipe事件:在指定的dom区域内,一个手指快速的在触屏上滑动。即我们平时用到最多的滑动事件。
    
    Swipeleft:向左滑动、Swiperight:向右滑动、Swipeup:向上滑动、Swipedown:向下滑动
    
    6、Tap事件:在指定的dom区域内,一个手指轻拍或点击时触发该事件(类似PC端的click)。该事件最大点击时间为250毫秒,如果超过250毫秒则按Press事件进行处理。
    

    10.vue 获取DOM元素ref

    vue中获取DOM元素,不用像原生js那么麻烦
    <div ref="recommend"></div> 在HTML中定义的时候需要写ref,才能调用
    在script中调用
    // 通过在html标签内写的ref来获取DOM,recommend需要和html中的ref的值对应
    let nav = this.$refs.recommend
    

    11.

    包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中
    
    意思就是:用<keep-alive></keep-alive>包裹我们在vue项目中创建的组件,可以做到切换无刷新,保留缓存
    
    
    当组件在 keep-alive 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。 
    
    include - 字符串或正则表达式。只有匹配的组件会被缓存。 
    exclude - 字符串或正则表达式。任何匹配的组件都不会被缓存。
    

    12.访问的接口跨域解决方法

    在npm官网下载jsonp 利用jsonp来解决跨域,
    
    
    想要获取服务器数据:
    1. 百度的页面请求百度服务器,直接ajax请求
    2. 百度的页面跨域请求其他(贴吧,音乐等)数据中的三种方法
    	一种是:贴吧,音乐服务器允许百度页面直接请求,服务器端设置权限(这样可以直接通过ajax跨域请求数据)
    	一种是:通过jsonp,这得服务器配合使用
    	一种是:通过代理,让服务器模拟浏览器请求(本质是欺骗服务器)
    

    13. 路由间数据传递

    app.vue 父级
    	 <router-link to="/tab/5572a109b3cdc86cf39001e3">热点</router-link>
    	 <router-view></router-view>
    router--index.js
    	routes: [
      		path: '/tab/:num',
      		name: 'tab',
      		component: Tab
    	]
    调用数据
    tab.vue 子级
    	this.$route.params.num
    	路由监听事件
    	$route(a,b) {console.log(a,b)} // 返回两个对象
    	
    

    14.exact

    exact是Route下的一条属性,一般而言,react路由会匹配所有匹配到的路由组件,exact能够使得路由的匹配更严格一些。
    

    15.props父子间组件传递

    15.1 父===》子

    父级
    <show :showList="showid"></show>
    
    <script>
    data () {
        return {
          showid: '传的参'
        }
      }
    </script>
    
    子级
    <script>
    	props: ['showList']
    </script>
    调用 {{showList}}  便可打印
    
    动态调用
    watch: {
        // 检测showList是否发生变化
        showList () {
          console.log(this.showList)
        }
      }
    

    15.2 子===》父

    子组件
    在一个方法里写,比如单击按钮写
    this.$emit('listenToChildEvent', false)
    
    父组件
    <show v-on:listenToChildEvent="showChild"></show>
    <script>
     methods: {
        showChild (data) {
          console.log(data) 便拿到到了子组件里的数据
        }
    }
    </script>
    

    16.打包apk

    vue打包
    1.运行生产模式	npm run build
      如果出现Built files are meant to be served over an HTTP server. Opening index.html over file:// won't work.
       因为vue-cli的默认配置中, publishPath是用绝对目录, 所以dist文件夹里的文件必须放在服务器的根目录, 如果你想本地打开的话, 可以在npm run build完成之后执行以下命令:
        cd dist
    	npm install -g http-server // 该命令只需执行一次, 安装过之后, 以后就不需要重复安装了.
    	hs
    
    
  • 相关阅读:
    大数据-KNN算法
    Java-单链表的实现
    Python分析《武林外传》
    Java-javaFx库运用-自动弹跳的球
    Java-javaFx库运用-时钟显示
    Python爬虫-《神雕侠侣》
    大数据-决策树
    Java--用键盘控制小球
    Java--下大雪模拟
    Java File ——Io流复习
  • 原文地址:https://www.cnblogs.com/luxiaoyao/p/8536114.html
Copyright © 2020-2023  润新知