• Vue笔记(自用版)


    1、v-for:循环列表。
    <ul>
    <li v-for="item in items">{{item}}</li>
    </ul>
    items:['1','2','3']
    还可以在控制台上直接对数组进行操作:如app.items.push('4');
    2、v-on:事件绑定。v-on:click。
    3、在app对象内,要用里面的data数据,则需要this.来访问。
    4、mvvm(model viewmodel model)
    5、开发中什么叫方法,什么叫函数?
    方法:methods:在类里面的函数叫方法
    函数:function
    6、vue生命周期:在创建一个vue实例时,vue已经做了一系列操作了。生命周期也称钩子函数。
    7、代码规范:两个空格而不是四个空格。
    8、v-once在某些情况下,我们不希望界面随意的跟随改变。该指令只渲染一次,不会随着数据的改变而改变。
    9、v-html 数据会按照HTML格式进行解析。
    10、v-text 和双括号比较相似,都是用于将数据显示在界面中。不能作用的标签上内写文本,否则会覆盖该文本。
    11、v-pre 原封不动地显示内容。
    12、v-cloak 配合[v-cloak]{display:none}来使用,目的是在js解析完前,不让拥有它的标签呈现,js解析完后
    会自动删除它。
    13、v-bind 给属性绑定值:如 <img v-bind:src="imgurl">
    14、计算属性computed:在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示
    计算属性会进行缓存,如果多次使用时,计算属性只会调用一次。这样性能就会高一些。
    计算属性是有set,和get方法。但一般都不用set方法,表示它是一个只读属性。
    15、ES6之前var没有块级作用域的概念,所以在很多时候,我们都必须借助于function的作用域来解决应用外面变量的问题。
    ES6中,加入了let,let它是有if和for的块级作用域。
    16、一旦给const修饰的标识符被赋值之后,不能修改。在使用const定义标识符,必须进行赋值。常量的含义是指向的对象
    不能改,但是可以改变对象内部的属性。
    17、v-on 如果方法不需要额外参数,那么会默认将原生事件event参数传递过去。如果需要同时传入某个参数,同时需要
    event时,Vue会默认将浏览器生产的event事件对象作为参数传入到方法。
    v-on修饰符:stop可以阻止事件冒泡。<div @click="divClick">
    <button @click.stop ></button>
    </div>
    prevent可以阻止事件自动提交。<form action="baidu">
    <input type="submit" value="提交" @click.prevent="submitClick">
    </form>
    监听某个键的键帽:如enter。<input type="text" @keyup.enter="keyup">
    once 只触发一次回调。
    18、v-if,v-else-if,v-else
    19、v-show,v-if的区别:v-if当条件为false时,包含v-if指令的元素,根本就不会存在dom中。
    v-show只是给元素添加一个行内样式:display:none
    如何选择:当需要在显示与隐藏之间切换很频繁时,使用v-show。当只有一次切换时,用v-if。
    20、官方推荐我们在使用v-for时,给对应的元素或组件添加上一个:key属性。
    当某一层有很多相同的节点时,也就是列表节点时,我们希望插入一个新的节点。我们希望可以在B和C之间插入一个F,Diff算法
    默认执行起来是这样的:即把C更新成C,E更新成D,最后再插入E,是不是很没有效率。
    所以我们需要使用key值来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。key
    的作用主要是为了高效的更新虚拟DOM。
    21、哪些数组得方法是响应式的。this.letters.push('s');//会渲染到页面上,是响应式的。类似的还有:pop,shift,unshift,splice,sort,reverse
    而 this.letters[0]=“bbbbb”//数组会被改变,但是不会渲染到页面上。不是响应式的。
    复习:push:在数组最后面添加元素,可以是多个
    pop:删除数组的第一个元素
    shift:删除数组中第一个元素
    unshift:在数组最前面添加元素,可以是多个.
    splice:删除元素/插入元素/替换元素
    splice(start,num);//num没有,从start起后面全删。
    splice(start,num,'m','l','n');//替换元素
    splice(start,0,'m','l','n');//插入元素
    sort:排序,可传参数(同java,进行升序降序排列)
    reverse:反转数组。
    附加:set(要修改的对象,索引值,修改后的值)
    Vue.set(this.letters,0,'bbb');也是响应式的。
    22、两种简便for循环:for(let i in books)//取出来的i是数组下标值。
    for(let item of books)//取出来的item是数组的项。
    23、js函数补充:
    filter:它的回调函数有一个要求:必须返回一个boolean值,当返回true时,函数内部会自动将这次回调的n加入到新的数组中,当返回false时,
    函数内部会自动过滤掉这次的n。
    map:返回的值都加到一个新数组里。
    reduce:对数组中所有值进行汇总。如全部相加,全部相乘。nums.reduce(function(preValue,n)){}第一个参数是上次循环return的值,n是这
    次的值。array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
    function(total,currentValue, index,arr) 必需。用于执行每个数组元素的函数。函数参数:
    total 必需。初始值, 或者计算结束后的返回值。
    currentValue 必需。当前元素
    currentIndex 可选。当前元素的索引
    arr 可选。当前元素所属的数组对象。
    initialVal 可选。传递给函数的初始值
    小例子:需求如下:将数组中小于100的数乘以2之后,全部相加。
    const nums = [10,20,30,110,234,43,567,34];
    let total = nums.filter(function(n){
    return n<100
    }).map(function(n){
    return n*2
    }).reduce(function(preValue,n){
    return preValue +n
    },0)
    更简单的方法:箭头函数
    num.filter(n=>n<100).map(n=>n*2).reduce((pre,n)=>pre+n);
    24、v-model指令是如何实现的?
    v-model其实也是个语法糖,它的本质上实际上是包含两个操作:
    通过v-bind指令把message绑定给输入框的value,然后用v-on监听输入框的input事件来实现反向绑定。
    <input type="text" v-model="message">
    <input type="text" :value="message" @input="valueChange">
    valueChange(event){
    this.message = event.target.value;
    }
    或者直接一点:@input="message=$event.target.value"
    25、
    1、用单选框实现性别互斥。
    通过使用name来实现:(有label的for属性,点击按钮和文字都能够进行选中)
    <lable for="male">
    <input type="radio" id="male" name="sex" value="男" v-model="sex">男
    <label>
    <lable for="female">
    <input type="radio" id="female" name="sex" value="女" v-model="sex">女
    <label>
    <h4>您选择的性别是:{{sex}}</h4>
    data:sex:'男'
    2、 checkbox实现单选框。
    <label for="agree">
    <input type="checkbox" id="agree" v-model="isAgree">同意协议
    </label>
    <h2>您选择的是:{{isAgree}}</h2>
    3、checkbox实现多选
    <input type="checkbox" value="篮球" v-model="hobbies">篮球
    <input type="checkbox" value="足球" v-model="hobbies">足球
    <input type="checkbox" value="乒乓球" v-model="hobbies">乒乓球
    <input type="checkbox" value="羽毛球" v-model="hobbies">羽毛球
    hobbies:[]
    4、select实现单选
    <select name="abc" v-model="fruit" >
    <option value="苹果">苹果</option>
    <option value="香蕉">香蕉</option>
    <option value="榴莲">榴莲</option>
    <option value="葡萄">葡萄</option>
    </select>
    5、select实现多选
    <select name="abc" v-model="fruits" mutiple>
    <option value="苹果">苹果</option>
    <option value="香蕉">香蕉</option>
    <option value="榴莲">榴莲</option>
    <option value="葡萄">葡萄</option>
    </select>
    26、值绑定v-bind
    <label v-for="item in Hobbies" :for="item">
    <input type="checkbox" :value="item" :id="item" v-model="hobbies">{{item}}
    </label>
    Hobbies:['篮球','乒乓球','足球','羽毛球']
    27、修饰符
    lazy:v-model默认是在input事件中同步输入框的数据的。也就是说,一旦有数据发生改变时
    就会自动发生改变。lazy修饰符可以让数据在数去失去焦点或者回车时才会更新。
    number:默认情况下,在输入框中无论我们输入的是字母还是数字,都会被当作字符串进行
    进行处理。number修饰符可以让在输入框中输入的内容自动转换成数字类型。
    trim:如果输入的内容首尾有很多空格,通常我们希望将其去除,trim修饰符可以过滤掉内容左右两边的空格。
    28、组件使用三个步骤:(1)创建组件构造器对象(2)注册组件(3)使用组件。
    1、Vue.extend();
    调用Vue.extend()创建的是一个组件构造器。通常在创建组件构造器时,传入template代表我们自定义组件的模板。
    该模板就是在使用到组件的地方,要显示的HTML代码。事实上,这种写法在Vue2.x的文档中已经看不到了。
    2、Vue.component();
    调用Vue.component()是将刚才的组件构造器注册为一个组件,并且给它起一个组件的标签名称。所以要传入两个参
    数:一个是注册组件的标签名,另一个是组件构造器。
    3、组件构造器必须挂载在某个Vue的实例下,否则它不会生效。
    4、全局组件和局部组件。Vue.components是全局组件。
    const app = new Vue({
    el:'#app',
    components:{//局部组件
    cpn:cpnC//cpn使用组件时的标签名,cpnC组件构造器名。
    }
    })
    5、注册组件的语法糖:
    const cpn1 = Vue.extend({
    template:
    <div>
    <h2>我是标题一</h2>
    </div>
    })
    Vue.component('cpn1',cpn1);
    等于:
    Vue.component('cpn1',{
    template:
    <div>
    <h2>我是标题一</h2>
    </div>
    });
    注册局部组件是在app实例里面进行的,用components属性同上面那样替换即可。
    6、组件的分离式写法
    方法一:
    <script type="text/x-template" id="cpn">
    <div>
    <h2>我是标题一</h2>
    </div>
    </script>
    Vue.component('cpn',{
    template:'#cpn'
    })
    方法二:
    <template id="cpn">
    <div>
    <h2>我是标题一</h2>
    </div>
    </template>
    Vue.component('cpn',{
    template:'#cpn'
    })
    7、组件数据的存放
    组件对象也有一个data属性(也可以有methods等属性),只是这个data属性必须是一个函数,而且这个函数返回一个
    对象,对象内部保存着数据。
    8、组件中的data为什么是函数。
    因为data中放回的对象一定要不同,不然所有组件都是一个状态。
    9、父子组件通信----子传父
    props:来声明需要从父级接收到的数据。
    props的值有两种方式:方式一:字符串数组,数组中的字符串就是传递时的名称。

    简单实例:
    <div id="#app">
    <child-cpn:cmessage="message"></child-cpn> //将data中的数据传递给props
    </div>
    <template id="childCpn">
    <div>显示的信息{{cmessage}}</div> //将props中的数据显示在子组件中
    </template>
    <script>
    let app=new Vue({
    el:'#app',
    data:{
    message:'hello'// Vue实例中的data
    },
    components:{
    'child-cpn':{
    template:'#childCpn',
    props:{'cmessage'} //子组件的props
    }
    }
    })
    </script>

    方式二:对象,对象可以设置传递时的类型,也可以设置默认值等。
    Vue.component('my-component',{
    props:{
    propA:Number,
    propB:[Number,String],
    propC:{
    type:String,
    default:100
    required:true
    },
    //带有默认值的对象
    propD:{
    type:Object,
    //对象或数组默认值必须从一个工厂函数获取
    default:function(){
    return { message:'hello'}
    }
    },
    //自定义验证函数
    propE:{
    validator:function(value){
    //这个值必须匹配下列字符串中的一个
    return ['success' ,'warning','danger'].indexof(value)!== -1
    }
    }
    }
    })
    10、v-bind不支持驼峰命名法.
    11、父传子
    自定义事件。流程是:在子组件中,通过$emit()来触发事件。
    在父组件中,通过v-on来监听子组件事件。
    例子:

    <!-- 父组件模板 -->
    <div id="app">
    <cpn @item-click="cpnClick"></cpn>
    </div>

    <!-- 子组件模板 -->
    <template id="cpn">
    <div>
    <button v-for="item in catagories" @click="btnClick(item)">{{item.name}}</button>
    </div>
    </template>

    <script src="vue.js"></script>
    <script>
    const cpn={
    template:'#cpn',
    data(){
    return {
    catagories:[
    { id:'aaa',name:'热门推荐'},
    { id:'bbb',name:'手机数码'},
    { id:'ccc',name:'家用家电'},
    { id:'ddd',name:'电脑办公'},
    ]
    }
    },
    methods:{
    btnClick(item){
    //发送事件
    this.$emit('item-click',item)
    }
    }
    }

    //父组件
    var app = new Vue({
    el:'#app',
    data:{
    message:'你好'
    },
    components:{
    cpn
    },
    methods:{
    cpnClick(item){
    console.log("--",item);
    }
    }
    })
    </script>
    29、插槽
    1.使用<slot></slot>
    2.插槽的默认值 <slot>button</slot>//中间有多个也会全部替换。
    3.具名插槽。
    30、CommonJs
    模块化有两个核心:导入和导出。
    CommonJS的导出:
    module.exports = {
    flag:true,
    test(a,b){
    return a+b
    }
    }
    CommonJs的导入:
    let { test ,flag}=require('路径');
    31、ES6中的导入和导出
    导出:export{name ,age , height}或者可以定义的时候也可以直接导出
    导入:import{name} from ''./aaa.js''
    导出函数/类:
    export function mul(num1,num2){
    return num1*num2
    }
    export class Person{
    constructor(name,age){
    this.name = name;
    this.age = age;
    }
    run(){
    console.log(this.age+'在奔跑');
    }
    }
    默认导出:某些情况下,一个模块中包含某个功能,我们并不希望给这个功能命名,而且让导入者
    可以自己来命名,这个时候就可以用export default
    export default function() {
    console.log('default function');
    }
    //myFunc是导入者自己命名的
    import myFunc from './info.js'
    myFunc();
    注意:export default在同一个模块中,不允许同时存在多个。
    统一全部导入
    import * as aaa from './aaa.js'
    console.log(aaa.flag)
    32、webpack
    (1) 什么是webpack?
    webpack是一个现代的Javascript应用的静态打包工具。
    (2) 什么是打包?
    就是将webpack中的各种资源模块进行打包合并成一个或多个包(bundle)。
    并且在打包的过程中,还可以对资源进行处理,比如压缩图片,将scss转成css,将ES6语法转成ES5语法,将Typescript
    转成JavaScript。
    (3)和grunt/gulp的区别?
    grunt/gulp的核心是Task,我们可以配置一系列的Task,并且定义Task要处理的事务(例如ES6,ts转化,图片压缩,Scss转成css)
    之后让grunt/gulp来依次执行这些task,而且让整个流程自动化。 grunt/gulp更加强调的是前端流程的自动化,模块化不是它的
    核心。webpack更加强调模块化开发管理,而文件压缩合并,预处理等功能,是它附带的功能。如果你的工程模块依赖非常简单,
    甚至没有用到模块化的概念。只需要进行简单的合并,压缩,使用grunt/gulp即可。
    (4)webpack,node,npm之间的关系?
    安装webpack首先需要安装Node.js,Node.js自带了软件包管理工具(npm)。(node package manage)。
    (5) webpack配置:
    新建文件:webpack.config,js
    内容:
    const path = require('path')
    module.exports = {
    entry:'./src/main.js',
    output:{
    path:path.resolve(__dirname, 'dist'),
    filename:'bundle.js'
    },
    }
    (6) package.json文件中:有一个script,里面包含的test,build等自定义路径,运行npm run build会运行对应指令。
    (7) loader
    在我们之前的实例中,我们主要用webpack来处理我们写的js代码,并且webpack会自动处理js之间相关的依赖。
    但是,在开发中,我们不仅仅有基本的js代码需要处理,我们也需要加载css,图片,也包括一些高级的将ES6转成
    ES5代码,将TypeScript转化成ES5代码等等,这些将通过webpack扩展对应的loader就可以了。
    使用步骤:1.通过npm安装需要使用的loader. npm install --save-dev css-loader
    npm install style-loader --save-dev
    2.在webpack.config.js中的modules关键字下进行配置。
    在webpack.config.js中加入
    module:{
    rules:[
    {
    test:/.css$/,
    use:[ 'style-loader','css-loader' ]//css-loader只负责将css文件进行加载,style-loader负责将
    //样式添加到Dom中,使用多个loader时,是从右向左的
    }
    ]
    }
    (8)plugin
    plugin是插件的意思。通常是用于对某个现有的架构进行扩展。
    loader和plugin的区别:loader主要用于转换某些类型的模块,它是一个转换器。
    plugin是个插件,它是对webpack本身的扩展
    plugin的使用步骤: 1.通过npm安装需要使用的plugins
    2.在webpack.config.js中的plugins中配置插件。
    33、vue cli
    (1) cli:Command-Line Interface,翻译为命令行界面,俗称脚手架。vue cli 是一个官方发布vue.js项目脚手架,使用vue-cli 可以快速搭建
    vue开发环境以及对应的webpack。
    (2) 使用前提:node
    (3) ESLint:自动检查不规范代码并编译不通过。前期安装了但是后期不想用怎么办?在config->index.js->useEslint:false
    (4) e2e end to end 端到端测试。
    (5) runtime-compiler: template->ast->render->vdom->ui
    runtime-only: render->vdom->ui
    34、箭头函数:也是一种定义函数得方式
    定义函数的方式:1、function : const aaa = function(){}
    2、对象字面量中定义函数: const obj = { bbb() {} }
    3、ES6中的箭头函数: const ccc = (参数列表)=>{ } //当只有一个参数时,参数列表的括号可以删除
    当返回值只有一行代码时,return 和大括号 也可以去掉
    箭头函数的this引用的就是最近作用域中的this。也就是它向外层作用域中,一层层查找this,直到有this的定义。
    35、什么是前端渲染,后端渲染?
    前端渲染:浏览器中显示的网页中的大部分内容,都是由前端写的js代码在浏览器中执行,最终渲染出来的网页。
    36、SPA页面:单页父应用,整个网页只有一个html页面。
    37、安装和使用vue-router
    安装:npm install vue-router --save 并:
    1.导入路由对象,并且调用Vue.use(VueRouter)
    2.创建路由实例,并且传入路由的映射配置
    3.在Vue实例中挂载创建的路由实例
    使用:创建路由挂件,配置路由映射:组件和路径映射关系,使用路由:通过<router-link>和<router-view>
    38、Promise
    Promise是异步编程的一种解决方案。
    39、better-scroll
    安装:npm install better-scroll --save(去github上下载引用也可以)
    基本使用:<div>
    <div class="content">
    <ul>
    <li></li>......(好多li)
    <ul>
    </div>
    </div> //挂载点只有一个标签,但是这个标签里面可以包含很多内容。
    const bscroll = new BScroll(document.querySelector('.content'),{
    probeType: 3 //probe侦测的意思。0,1都是不侦测实时的位置 2:在手指滚动的过程中侦测,手指离开后的惯性滚动过程中不侦测。
    //3:只要是滚动,都侦测。

    })

    40、ref如果是绑定在组件中的,那么通过'this.$refs.refname'获取到的是一个组件对象
    ref如果是绑定在普通元素中的,那么通过'this.$refs.refname'获取到的是一个元素对象。
    41、<style scoped>表示只在当前作用域下有效。
    42、组件是不能直接进行点击的,要点击要用@click.native




  • 相关阅读:
    机器学习入门
    elixir 高可用系列
    elixir 高可用系列(五) Supervisor
    elixir 高可用系列(四) Task
    elixir 高可用系列(三) GenEvent
    golang 值得注意的地方(2则)
    elixir 高可用系列(二) GenServer
    elixir 高可用系列(一) Agent
    elixir 入门笔记
    elixir mix 简介
  • 原文地址:https://www.cnblogs.com/Aguuu-/p/12970901.html
Copyright © 2020-2023  润新知