Vue基础1(持续更新)

 vue基础

---

#### <font color=pink>小知识(老陈vue)</font>

* 1、在node.js/npm相当于java中的maven(会在互联网中下载包,需要哪些就下载哪些)

* 2、在vue组件内部有两个数据,一个合适props,一个是data,这两种数据的变化都会使界面更新

- props:是从父元素传下来的只读数据(不允许当前子元素被修改)

- data:是自己维护的可以更新和修改(可以被自己修改)

* 3、什么是组件:组件就是自定义的html标签

#### <font color=red>自己百度小知识(菜鸟小蒙)</font>

### 比较杂

* 多重循环写数据 | 外面控制行 |里面控制列

- 页面要数据get 页面填数据是set

- 1、两种注入的对象类型:引用ref、值value

- 2、p命名空间

- p:属性名="值"

- p:属性名-ref="bean的id"

- 3、两种注入的方式

- <property/>

- <constructor-arg/>

- 4、三种Bean的创建方式

- 之间反射创建(new)

- 静态工厂方法

- 实例工厂方法

- 5、生命周期管理

- <bean  init-method="" destory-method=""/>

- 6、v-bind:双向绑定

- v-html:属性绑定

- v-on:将当前时间绑定到当前的标签

- v-on:dbclick

- once:只有第一次才能有效果

  ##### vuex管理状态

  * mint-ui  ui组件库

  * vue-lazyload 懒加载

  * better-scroll 滑动库

  * eslint  检查语法是否规范

    ##### 组件创建期间的4个钩子函数

    * 第一个生命周期函数,表示实例完全被创建之前,会执行这个函数 <font color=red>beforCreate</font>生命周期函数执行的时候,<font color=red>data</font>和<font color=red>methods</font>中的数据还没有被初始化。

    * 第二个生命周期函数,如果要调用methods中的方法,或者操作data中的数据,最早只能在created中才做

    * 第三个生命周期函数,表示模板已经在内存中编译完成,但是尚未把模板渲染带页面中,在beforeMount执行的时候,页面中的元素没有被真正替换过来,只是之前写的一些模板字符串

    * 第四个生命周期函数,表示内存中的模板已经真实的挂载到页面中,用户已经可以看到渲染好的页面,这个mounted是实例创建期间的最后一个生命周期函数,当执行完mounted就表示,实例已经被完整创建好了,此时,如果没有其他操作的话,这个实例就在静静地在内存中不动了

    * 第五个生命周期函数。表示界面还没有被更新但是数据肯定被更新了当执行beforeUpdate的时候页面中显示的数据还是旧的,此时data数据是最新的,页面尚未和最新的数据保持同步

    * 第六个生命周期函数,updated事件执行的时候,页面和data数据已经保持同步,都是最新的。

      #### 什么是钩子函数?

      * 百度百科是这样解释的:钩子函数是window消息处理机制的一部分,通过设置"钩子",应用程序可以在系统对所有消息、时间进行过滤,访问在正常情况下无法访问的消息。钩子函数本质是一段用以处理系统消息的程序,通过系统调用,把榻挂入系统。

      * <font color=red>钩子函数:1、首先他是个函数,在系统触发时被系统调用    2、不是用户自己触发的钩子函数的名称是确定的,当小童消息触发,自动回调用,</font>

      * 例如:react的componentWillUpdate函数,用户只需要编写componentWillUpdate的函数体,当组件状态要更新是,系统就会条用componentWillUpdate,

      * <font color=red>常见的钩子函数:react的生命周期,vue的生命周期函数</font>

      * beforeCreate:创建前

      * created:创建后

      * beforeMount:挂载前

      * mounted:挂载后

      * beforeDestroy:销毁前

      * destroyed:销毁后

      * beforeUpdate:更新前

      * update:更新后

---------------------------------------

#### (1).历史介绍

* angular 09年,年份较早,一开始大家是拒绝 

* react 2013年, 用户体验好,直接拉到一堆粉丝

* vue 2014年,  用户体验好

#### (2).前端框架与库的区别?

* jquery 库 -> DOM(操作DOM) + 请求

* art-template 库 -> 模板引擎

* 框架 = 全方位功能齐全


  - 简易的DOM体验 + 发请求 + 模板引擎 + 路由功能

* KFC的世界里,库就是一个小套餐, 框架就是全家桶

* 代码上的不同

  - 一般使用库的代码,是调用某个函数,我们自己把控库的代码

  - 一般使用框架,其框架在帮我们运行我们编写好的代码

    - 框架:  初始化自身的一些行为

      - 执行你所编写的代码

      - 施放一些资源

#### (3).vue起步

* 1:引包

* 2:启动 new Vue({el:目的地,template:模板内容});

* options

  * 目的地 el

  * 内容 template

  * 数据 data  保存数据属性

    数据驱动视图

#### vue的文件介绍

#### (4).插值表达式

* {{ 表达式 }}

  - 对象 (不要连续3个{{ {name:'jack'} }})

  - 字符串 {{ 'xxx' }}

  - 判断后的布尔值  {{  true }}

  - 三元表达式  {{ true?'是正确':'错误'  }}

* 可以用于页面中简单粗暴的调试

* 注意: 必须在data这个函数中返回的对象中声明

#### (5).什么是指令

* 在vue中提供了一些对于页面 + 数据的更为方便的输出,这些操作就叫做指令, 以v-xxx表示

  * 比如html页面中的属性 ```<div v-xxx ></div>``

* 比如在angular中 以ng-xxx开头的就叫做指令

* 在vue中 以v-xxx开头的就叫做指令

* 指令中封装了一些DOM行为, 结合属性作为一个暗号, 暗号有对应的值,根据不同的值,框架会进行相关DOM操作的绑定

#### (6).vue中常用的v-指令演示

* v-text:元素的InnerText属性,必须是双标签 跟{{ }}效果是一样的 使用较少

* v-html: 元素的innerHTML

* v-if : 判断是否插入这个元素,相当于对元素的销毁和创建

* v-else-if

* v-else

* v-show 隐藏元素  如果确定要隐藏,  会给元素的style加上display:none。是基于css样式的切换

```javascript

v-text 只能用在双标签中

v-text 其实就是给元素的innerText赋值

v-html 其实就是给元素的innerHTML赋值

v-if 如果值为false,会留下一个<!---->作为标记,万一未来v-if的值是true了,就在这里插入元素

如果有if和else就不需要单独留坑了

如果全用上  v-if 相邻v-else-if 相邻 v-else 否则 v-else-if可以不用

v-if和v-else-if都有等于对应的值,而v-else直接写

v-if家族都是对元素进行插入和移除的操作

v-show是显示与否的问题

注意: 指令其实就是利用属性作为标识符,简化DOM操作,

  看:v-model="xxx"

  v-model 代表要做什么  xxx代表针对的js内存对象

  写在那个元素上,就对哪个元素操作

```

#### (7).v-if和v-show的区别 (官网解释)

`v-if` 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

`v-if` 也是**惰性的**:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

相比之下,`v-show` 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。

一般来说,`v-if` 有更高的切换开销,而 `v-show` 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 `v-show` 较好;如果在运行时条件很少改变,则使用 `v-if` 较好。

#### (8).v-bind使用

* 给元素的属性赋值  <div id="{{变量}}"></div>

  - 可以给已经存在的属性赋值 input value

  - 也可以给自定义属性赋值 mydata

* 语法 在元素上 `v-bind:属性名="常量||变量名"`

* 简写形式 `:属性名="变量名"`

* ```html

  <div v-bind:原属性名="变量"></div>

  <div :属性名="变量">


  </div>

  ```

#### (9).v-on的使用

* 处理自定义原生事件的,给按钮添加click并让使用变量的样式改变

* 普通使用  ```v-on:事件名="表达式||函数名"```

* 简写方式  ``` @事件名="表达式"```

#### 1-9知识点阶段总结

* 如何启动vue  : 1:引包 2:留坑 3:启动(new Vue) 

  * options:  el/template/data函数

* 更便捷的操作DOM及数据  v-xxx指令

  * v-text/v-html/v-if/v-show/v-bind/v-on

  * v-bind绑定属性值

  * v-on绑定事件

#### (10).v-model

* 双向数据流(绑定)

  * 页面改变影响内存(js)

  * 内存(js)改变影响页面

#### (11).v-bind 和 v-model 的区别?

* `input v-model="name"`

  - 双向数据绑定  页面对于input的value改变,能影响内存中name变量

  - 内存js改变name的值,会影响页面重新渲染最新值

* `input :value="name"`

  - 单向数据绑定 内存改变影响页面改变

* v-model: 其的改变影响其他  v-bind: 其的改变不影响其他

* v-bind就是对属性的简单赋值,当内存中值改变,还是会触发重新渲染

#### (12).v-for的使用

* 基本语法 `v-for="item in arr"`

* 对象的操作 `v-for="item in obj"`

* 如果是数组没有id

  * `v-for="(item,index) in arr" :class="index" `

* 各中v-for的属性顺序(了解)

  * 数组 item,index

  * 对象 value,key,index

##### 漂亮的列表

* class 是可变的

#### 关于对象内的this

* vue已经把以前this是window或者事件对象的问题搞定了

* methods和data本身是在同一个对象中的,所以在该对象中可以通过this.随意取

* this.xxx 取data中的值, this.xxxMethod调methods中的函数

#### (13).局部组件的使用

渲染组件-父使用子组件

* 1: 创建子组件(对象)

  - `var Header = { template:'模板' , data是一个函数,methods:功能,components:子组件们 } `

* 2: 在父组件中声明,根属性`components:{ 组件名:组件对象 }`

* 3: 在父组件要用的地方使用 `<组件名></组件名>`

  - 在不同框架中,有的不支持大写字母,用的时候

    + 组件名 MyHeader

    + 使用 my-header

* 总结: 有父,声子,挂子,用子

### (14)组件深入

---

#### 父子组件传值(父传子)

* 1:父用子的时候通过属性Prop传递

* 2:子要声明props:['属性名'] 来接收

* 3:收到就是自己的了,随便你用

  - 在template中 直接用

  - 在js中 this.属性名 用

* 总结:父传,子声明,就是子的了

* 小补充: 常量传递直接用,变量传递加冒号

* ![image-20180811220901826](/var/folders/7b/sz6pt5jd3y3b51q1ngm_8pph0000gn/T/abnerworks.Typora/image-20180811220901826.png)

#### 总结父传子

* 父用子    先声子,挂子,用子

* 父传子    父传子(属性),子声明(收),子直接用(就是自己的一样)

#### 注册全局组件

* 应用场景: 多出使用的公共性功能组件,就可以注册成全局组件,减少冗余代码

* 全局API `Vue.component('组件名',组件对象);`

#### 附加功能:过滤器&监视改动

* filter

  * 将数据进行添油加醋的操作

  * 过滤器分为两种

    * 1:组件内的过滤器(组件内有效)

    * 2:全局过滤器(所有组件共享)

  * 先注册,后使用

  * 组件内 `filters:{ 过滤器名:过滤器fn }` 最终fn内通过return产出最终的数据

  * 使用方式是 `{{ 原有数据 | 过滤器名  }}`

  * 需求

    * 页面input框输入字符串, 另一边显示其反转的内容

  * 过滤器fn:

    * 声明`function(data,argv1,argv2...){}`

    * 使用`{{ 数据 | 过滤器名(参数1,参数2) }}`

* watch 监视单个

* computed 监视多个

#### 模块化

* webpack命令

  `npm init -y`

  `npm install webpack@2.2.1 --save-dev --registry https://registry.npm.taobao.org`

* package.json文件

  `"scripts": {

    "test": "webpack ./main.js ./build.js"

  },`

* 命令行运行 `npm run test`

#### ES6模块

* 导入和导出只能存在顶级作用域

* require引入是代码执行的时候才加载

* import 和export 都是提前加载 ,加载在代码执行之前

#### 箭头函数和function

* 一方面箭头函数是种简写形式

* 应用场景: 由于箭头函数本身没有this和arguments,通常用在事件类的回调函数上,让其向上级function绑定this,而非事件对象

* 箭头函数不可以作为构造函数

#### ES6函数简写

* 用在对象的属性中

```javascript

fn3() { //干掉了:function,用在对象的属性中

console.log(this);

},

```

#### key

* 使用子组件循环输出一堆数据

* 不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。

* 建议v-for就写,提升性能,避免vue运算,key就是记录元素与dom间的位置关系

```html

<son v-for="(item,index) in persons" :key="index" ></son>

```

#### slot

* slot就是子组件里给DOM留下的坑

* <子组件>DOM</子组件>

* slot动态的DOM、props是动态的数据

#### 组件生命周期

* 需要频繁的创建和销毁组件

  - 比如页面中部分内容显示与隐藏,但是用的是v-if

* 组件缓存

  - 内置组件中<keep-alive>

  - 被其包裹的组件,在v-if=false的时候,不会销毁,而是停用

  - v-if="true" 不会创建,而是激活

  - 避免频繁创建组件对象的性能损耗

* 成对比较

  - created 和 beforeCreate

    + A 可以操作数据 B 数据没有初始化

  - mounted 和 beforeMount

    + A 可以操作DOM B 还未生成DOM

  - updated 和 beforeUpdate

    + A 可以获取最终数据 B 可以二次修改

  - 频繁销毁创建的组件使用内置组件<keep-alive></keep-alive>包裹

```javascript

activated(){  //激活的 keep-alive v-if="true"

console.log('activated')

},

deactivated(){  //停用的 keep-alive v-if="false"

console.log('deactivated')

},

beforeDestroy(){ //销毁前 v-if="false"

console.log('beforeDestroy')

},

destroyed(){//销毁后 v-if="false"

console.log('destroyed')

},

```

#### 获取DOM元素

* 救命稻草, document.querySelector

* 1: 在template中标识元素 ref="xxxx"

* 2: 在要获取的时候, this.$refs.xxxx 获取元素

  - 创建组件,装载DOM,用户点击按钮

* ref在DOM上获取的是原生DOM对象

* ref在组件上获取的是组件对象

  - $el 是拿其DOM

  - 这个对象就相当于我们平时玩的this,也可以直接调用函数

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 主要还是自己看的,所有内容来自官方文档。 介绍 Vue.js 是什么 Vue (读音 /vjuː/,类似于 vie...
    Leonzai阅读 3,320评论 0 25
  • 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: 实例生命周期钩子 每个 Vue 实例...
    Timmy小石匠阅读 1,370评论 0 11
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,193评论 0 6
  • Vue是一个前端js框架,由尤雨溪开发,是个人项目 Vue近几年来特别的受关注,三年前的时候angularJS霸占...
    6e5e50574d74阅读 550评论 0 0
  • vue.js 从基础到实战 Vue.js 介绍 什么是vue vue一词是法语,同英语中的view。vue.js是...
    记忆的时间差阅读 2,202评论 1 25