vue.js

vue.js

谁在影响着页面?model中的data

Vue.js 官网

api学习步骤

  1. 引文件
  2. 写结构
  3. 初始化js

简介

是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。 (数据驱动编程)

MVVM

  • m 数据模型
  • v 视图模型
  • vm 一个同步

声明式渲染

Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:

<div id="app">
  {{ message }}
</div>
|||||||||||||||||||||||||||||||
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})

差值表达式--渲染文本(推荐使用)

位于标签的innerHTML的位置

  • 表达式
  • 三元表达式

指令(以v-开头)

位于标签属性位置,同样可以使用表达式

v-text--渲染文本

不能渲染带标签的文本

v-html--(谨慎使用)

可以解析标签,比较危险,永不用在用户提交的内容上

v-bind--(给属性赋值)

可以用来动态绑定属性 使用方式:v-bind:属性名="data中的属性" 简写方式::属性名="data中的属性" 可以绑定任何属性,此绑定在往后的组件开发中经常使用 可以动态绑定样式::class="{'类名':布尔值}" true:有类名,false:没有类名;也可以 :class="{'类名':布尔值, '类名': 变量名}" ,可以通过更改变量的值,来动态操作类名

v-for--(for循环--渲染数组和对象)

  1. 渲染数组
  1. v-for="item in arr", item是数组中的每一项的意思,可以随意,arr表示需要便利的数组
  2. v-for="(item,index)in arr" index表示数组项的索引
  1. 渲染对象
  1. v-for="value in obj", value是对象键的值,可以随意,obj表示需要便利的对象
  2. v-for="(value,key,index)in obj" index表示数组项的索引
  1. 迭代数字

v-for="item in 数字"

  1. 改变数组

Vue.set() Array.prototype.aplice()或者Array.aplice()

  1. :key

只要写了 v-for 就必须写上 :key --唯一标识,提高性能

v-model--(用来双向数据绑定)

只能在input/tettxtarea/select

v-on--(事件监听)

在methods属性中定义函数,要获取data中的属性,需要加上this.,this表示vue实例

  1. v-on: 任意的事件类型="执行的函数"
  2. 简写形式:@任意的事件类型="执行的函数"
  3. 通过执行函数添加参数
  4. 通过执行函数中添加$event参数传递事件对象--名字不能更改,不能加引号
  5. 事件修饰符,可以给事件添加特殊功能:.prevent(阻止默认跳转),.stop(阻止冒泡)
  6. 可以给和按键相关的事件添加按键修饰符,常有的 keyup.enter,keyup.键盘码

v-if 和 v-show

控制元素的显示可隐藏,v-if="布尔值"v-show="布尔值",true则显示,false则隐藏 区别:v-if通过控制dom来控制元素显示和隐藏;v-show通过控制display:none来控制元素显示和隐藏; 使用场景:

  1. 涉及到大量dom操作的时候,我们需要使用v-show; 多次显示和隐藏 使用v-show
  2. 涉及到异步数据渲染的时候,需要使用v-if; 单次显示和隐藏 使用v-if

v-if,v-else-if,v-else 条件判断

      <p v-if="type ==='A'">A</p>
      <p v-else-if="type ==='B'">B</p>
      <p v-else-if="type ==='C'">C</p>
      <p v-else>not:A/B/C</p>
      ---
      var vm = new Vue({
        el: '#app',
        data: {
          isvisibilty: true,
          type: 'B'
        }
      })

v-cloak -- (解决元素闪烁的问题)

  1. 给闪烁的元素加上v-cloak指令
  2. 写样式:[v-cloak]{display:none},当vue实例结束编译之后(当vue文件加载完成后),v-clock会被删除
  3. 另外,可以使用v-text添加内容,此时,vue文件没有加载时,元素不会得到内容,就不存在闪烁问题

this指向

在vue中,this指向创建的实例对象

mounted--钩子函数

表示页面一加载就执行函数里的内容 注意:函数的名字不能随意取,而且,不能写在methods中

自动获取焦点

    1. ref="名字"--表示对dom的引用
    1. 通过this.$refs.名字获取dom操作元素
    1. focus()自动获取焦点

自定义指令

  • 形式一
  1. 通过全局方法Vue.directive()创建,包含两个参数,1.表示自定义指令的名字(全部小写);2.是一个对象,表示自定义指令的配置项
  2. 配置项中是一些钩子函数
    • inserted钩子函数,表示自定义指令插入到标签中的时候就执行
    • 参数(el,binding):1.el:使用自定义指令的元素,2.binding表示自定义指令的信息
  3. 使用:dom中加入v-myfocus
Vue.directive('myfocus',{
    inserted(el,binding){
        el.focus();
    }
})

  • 形式二

Vue.filter()--创建过滤器

参数:过滤器名称,函数

{{item.timer | fmtTime('/')}}

Vue.filter('fmtTime'.function(time,seprator){
    var y = time.getFullYear();
    var m = time.getMonth()+1;
    var d = time.detDate();
    return y+seprator+m+seprator+d;
})

computed--计算属性

根据data中已有的实行,计算得到一个新属性 创建计算属性,通过computed关键字,它是一个对象 这里的fullName就是一个计算属性,是一个函数,但可以当做属性来使用 好处:

  • 有缓存的特性,多次使用,只会计算一次,提升性能
{{fullName}}

computed:{
    fullName(){
        return this.firstName+this.lastName;
    }
}

watch--监听器

用来监听data中的数据的值,当数据发生改变,就执行相应的函数,通过watch创建监听器,它是一个对象,函数名是监听的对象,执行的函数有两个参数(newVal,oldVal) 开发时,能用computed就不用watch computed 有缓存的功能,需要计算的时候,使用computed watch会一直监听,需要执行异步操作时使用watch

watch:{
    firstName(newVal,oldVal){
        this.watchName = newVal + this.lastName;
    },
    lastName(newVal.oldVal){
        this.watchNamw = this.firstName + newVal;
    }
}

深度监听--监听对象

  1. handeler:(newVal,oldVal){}--监听处理函数,名字固定
  2. deep:true--深度监听
watch:{
    user:{
        handler(newVal,oldVal){
            console.log(newVal.name)
        },
        deep:true
    }
}

搜索功能实现

数组的过滤

filter--有循环遍历的功能

过滤条件:判断是否包含字符串

indexof
return this.list.filter(value=>value.name.indexOf(this.searchVal) !== -1)

axios--get

axios--post

过渡和动画

  1. 使用 transition 标签包裹

animate.css 动画库--第三方css动画库

  1. 引入css文件
  2. 使用transition标签包裹
  3. 添加属性名="animated 添加类名"
    • enter-active-class="animated fadeInRight" 定义进入的动画状态
    • leave-active-class="animated fadeOutRight" 定义离开的动画状态

JavaScript 钩子

删除动画

Vue组件

  1. 什么是组件

  2. 组件开发好处

    • 封装功能性代码,提升开发效率

组件的创建

注意:

  1. 模板template中只能有一个根节点
  2. 组件的名字,如果使用驼峰命名的话,在使用的时候需要嘉盛"-",比如组件的名字叫indexA,在使用时就叫index-A

创建方式一

使用Vue.extend()和Vue.component()两个方法

  • Vue.extend()函数 会返回一个组建的构造器,它里面包含一个参数template,他是一个对象,里面是一些配置项,指定组件显示的模板
  • Vue.component()函数会利用Vue.extend()函数返回的构造器创建一个组件的实例,它有两个参数,一个是组件的名字,另外一个组件的构造器

组件使用步骤

  1. 定义组件(显示的内容)
var Index = Vue.extend({
//指定组件显示的模板
    template: "<div>我是首页</div>"
});

  1. 注册组件
Vue.component('index',Index);

  1. 使用组件,就像使用HTML标签一样
<index></index>   

创建方式二

Vue.component()这个方法本质上还是要调用Vue.extend()方法

Vue.component('indexB',{
    template: "<div>我是首页</div>"
});

---
<index-b></index-b>  

创建方式三

通过指定模板创建,定义的模板需要在Vue管辖范围之外

//模板一(推荐使用)
<template id="itcast">
    <div>我是首页</div>
</template>
//推荐二(js标签)
<script type="x-template" id="iecast">
    <div>我是首页</div>
</script>
---
Vue.component('indexC',{
    template: "#itcast"
});

---
<index-c></index-c>  

组件中使用指令和事件

父子组件的创建

//创建father组件
Vue.component('father',{
    template:'<div>我是父组件<son></son></div>';
    //通过components属性创建子组件
    components:{
    创建一个son组件
        son:{
            template:'我是子组件'
        }
    }
})

---使用---

<father></father>

父子组件和子组件间的传值

  1. 父子组件传值给子组件

父组件向子组件传值需要考虑两个问题: 父组件怎么传值:属性动态绑定(v-bind) 子组件怎么接收:props:能够获得当前组件身上属性对应的值

//创建father组件
Vue.component('father',{
    //通过v-bind给指令,给子组件中的props赋值
    template:'<div>我是父组件,我儿子叫{{sonName}},今年{{age}}<son :myName="sonName"></son></div>',
    data(){
        return{
            sonName:'小明',
            age:20
        }
    }
    //通过components属性创建子组件
    components:{
    创建一个son组件
        son:{
           //1\. 声明props,它的作用是,用来接收父组件传过来的值,props可以跟一个数组,数组里的值是一个一个的字符串,可以当做属性使用
           props:['myName'],
           template:'我是子组件,我叫{{myName}}'
        }
    }
})

  1. 子组件给父组件传值
  1. 子组件传值给父组件,需要用到$emit()方法,这个方法可以传递两个参数,一个是事件名,另外一个是需要传递的值-----(触发一个事件tellFatherMyName,并且传递一个值)
  2. 父组件接收参数:注册一个事件getMySonName,接收参数data
//创建father组件
Vue.component('father',{
    template:'<div>我是父组件,我儿子的名字是{{sonName}}
        <son @tellFatherMyName="getMySonName"></son>
    </div>';
    data(){
        return{
            sonName:''
        }
    },
    methods:{
        getMySonName(data){
            this.sonName=data
        }
    }
    //通过components属性创建子组件
    components:{
    创建一个son组件
        son:{
            template:'我是子组件,我的名字{{myName}},<button @click="emitMyName">发送数据</button>',
            data(){
                return{
                    myName:'小明'
                }
            },
            methods:{
                emitMyName(){
                    this.$emit('tellFatherMyName',this.myName)
                }
            }
        }
    }
})

  1. 兄弟组件传值

创建动态组件

利用component标签创建动态组件,他的is属性指向谁,就显示哪个组件

<ul>
<li @click="currentCom='index'">首页</li>
<li @click="currentCom='productType'">蔬菜</li>
<li @click="currentCom='productType'">水果</li>
</ul>
<component :is="currentCom"></component>

//组件
Vue.component('index',{
    template:"<div>首页</div>"
})
Vue.component('productType',{
    template:"<div>这里显示商品编号</div>"
})

vue实例(组件)生命周期

在实例被创建之后立即被调用,在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算,watch/event时间回调。然而,挂载阶段还没开始,dom还未开始,$el属性目前不可见。

created:function(){
    console.log(this.$el);
    console.log(this/$data);
    console.log(this.info);
}
模板编译之后调用,
mounted:function(){
    console.log(this.$el);
    console.log(this/$data);
    console.log(this.info);
}

Vue-router 路由

路由初体验

  1. 引入路由文件

vue-router.js

  1. 准备路由需要的组件
    Vue.component('index', {
      template: "<div>首页</div>"
    })
    Vue.component('productType', {
      template: "<div>这里显示商品编号</div>"
    })

  1. 创建路由对象,在这个对象里配置路由规则

var routers = new Router()

  1. 通过routes属性配置路由规则,它是一个数组,里面放的是对象,每个对象对应一条规则。并且每个对象都包含(name,path,component)--(路由规则的名称,路径,路径对应的组件)
   routes:[
        {name:'index',path:'/index',component:index},
        {name:'productType',path:'/product_type',component:productType}
   ]

  1. 在vue实例中注册路由,这样整个应用程序中都会拥有路由
var vm = new Vue({
      el: '#app',
      router: routers,
      data: {

      }
    })

  1. 通过router-view挖坑,路径匹配到的组件都会渲染到这个坑里

<router-view></router-view>

  1. vue路由中通过router-link(这是一个标签)去做跳转,他的to属性,这个值必须和path中的路径对应
  2. router-link,将来会被渲染成a标签,to属性会被渲染成a标签的href属性,但它的值前面会加一个#,变为锚点

<router-link to="/index">首页</touter-link> <router-link to="/product_type">水果</router-link>

  • 总结:步骤一共三步:1.问路,2.创建路由规则 3. 创建组件 4. 注册路由 5.挖坑

路由参数

  • 第一种方法
  1. 路由加参数::参数名--{name:'productType',path:'/product_type/:id',component:productType}
  2. 在html中获取路由参数,通过$route.params.参数名
template: "<div>这里显示商品编号{{$route.params.id}}</div>"

  1. 在js中获取路由参数,通过this.$route.params.参数名
template: "<div>这里显示商品编号{{$route.params.id}}</div>",
mounted(){
    console.log(this.$route.params.id);
}

  • 第二种方法(不影响路由path)
  1. 直接在跳转路径后使用真正传参的方式:/product_type?参数名=值
<router-link to="/product_type?id=22">水果</router-link>

  1. HTML中获取路由参数,通过$route.query.参数名
template:"<div>商品编号{{$route.query.id}}</div>"

  1. js中获取路由参数,通过this.$route.query.参数名

监听路由参数的变化-watch

'$route'表示监听对象,to表示将要去的路由对象,from表示你从呢个路由对象来

watch:{
    '$route'(to,from){
        console.log(to);
        console.log(from);
        if(to.perams.id === 22){
            console.log('胡萝卜。。。')
        } else {
            console.log('苹果')
        }
    }
}

嵌套路由和编程式导航

路由重定向

当不符合前边的规则,此规格生效,path:表示输入的所有路径,redirect:表示,强制跳转的路由地址

  1. {name:'default',path:'*',redirect:'/index'}
  2. {name:'default',path:'*',redirect:{name:'index'}

webpack

什么是webpack

webpack

webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler),分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Sass,TypeScript等),并将其转换和打包为合适的格式供浏览器使用。

webpack起步

  1. 安装 cnpm i webpack#3.11.0 -g
  2. 打包:webpack app.js index.js (改变代码,都要重新打包)
  3. 配置文件:webpack.config.js
var path = require('path')
module.exports={
  //配置入口文件
  entry:'./src/app.js',
  //配置输出文件
  output:{
    //表示输出文件的路径(绝对路径)
    path:path.join(__dirname,'dist'),
    //表示输出文件的名字
    filename:'bundle.js'
  }
}

此时,命令中直接输入webpack就可以,自动创建一个文件夹dist,这里边放的是打包后的文件

  1. webpack-dev-server(插件,解决以上问题)
    1. cnpm init -y
    1. cnpm i webpack-dev-server@2.9.7 webpack@3.11.0 -D
    1. webpack.config.js中配置publicPath: '/dist',
    1. index.html中修改 <script src="/dist/bundle.js"></script>
    1. 运行:webpack-dev-server
    1. 运行:webpack-dev-server --inline --hot --open --port 8090
    1. 配置script:"dev": "webpack-dev-server --inline --hot --open --port 8090"
    1. npm run dev

单文件组件

  • 全局组件的弊端:
  1. 名字不能重复
  2. template没有语法高亮
  3. 不支持css
  4. 没有构建步骤
  • 单文件组件
  1. 扩展名:.vue 完整语法高亮; CommonJS 模块; 组件作用域的 CSS 步骤:
// 1\. 安装vue的包:  cnpm i vue -S
// 2\. 由于 在 webpack 中,推荐使用 .vue 这个组件模板文件定义组件,所以,需要安装 能解析这种文件的 loader    cnpm i vue-loader vue-template-complier -D
// 3\. 在 app.js 中,导入 vue 模块  import Vue from 'vue'
// 4\. 定义一个 .vue 结尾的组件,其中,组件有三部分组成: template script style
// 5\. 使用 import App from './components/App.vue' 导入这个组件
// 6\. 创建 vm 的实例 var vm = new Vue({ el: '#app', render:h => h(App) })
// 7\. 在页面中创建一个 id 为 app 的 div 元素,作为我们 vm 实例要控制的区域;

vue.cil脚手架工具

  • 准备工作:
  1. 运行:cnpm i vue-cli -g
  2. 新建一个文件夹(project)
  3. 在此文件夹中打开终端,vue init webpack admin,出现? Project name (admin)表示成功,后一直按回车,。。出现? Use ESLint to lint your code? (Y/n)n,继续按回车,出现
? Should we run `npm install` for you after the project has been cre
ated? (recommended) (Use arrow keys)
> Yes, use NPM
  Yes, use Yarn
  No, I will handle that myself

按上下键,选择no,完成。

  1. 打开admin文件夹,打开终端,cnpm i, 完成后输入npm run dev 出现I Your application is running here: http://localhost:8080,表示成功
  2. 新建数据库,数据库名:itcast,编码字符集utf-8
  3. 导入sql文件D:\js高级资料\Vue\Vue_day06\代码\shop2-server\db
  4. config文件夹中default.json文件中更改用户名密码
  5. D:\js高级资料\Vue\Vue_day06\代码\shop2-server路径下,打开终端,运行cnpm i
  6. 运行node app,成功

element-ul框架

  1. 下载 cnpm i element-ui -S
  2. 完整引入----在 main.js 中写入以下内容:
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';

Vue.use(ElementUI);

new Vue({
  el: '#app',
  render: h => h(App)
});

以上代码便完成了 Element 的引入。需要注意的是,样式文件需要单独引入。

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

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,046评论 0 29
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,204评论 0 6
  • Vue.js起步 文档 Vue.js是一个MVVM的前端框架,与React.js相似,都注重解决view层开发痛点...
    刘昊2018阅读 256评论 0 0
  • Vue.js是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架。与其...
    鱼鱼吃猫猫阅读 3,238评论 1 12
  • 圣诞节,考研,情人节,没有情人,有的只是在最后时刻的成绩。不知道说什么,一切好像都在意料之中,又在意料之外。开学了...
    416aee6c68b5阅读 204评论 0 0