vue基础

  • index.html为首页入口文件,你可以添加一些 meta 信息或统计代码啥的;<div id=app与main.js文件绑定。
  • main.js: 项目的核心文件。
  • 实例化vue对象
    new Vue({
    el: '#app',
    // el:element代表根容器,对应为根目录下index.html的<div id=app>
    //所有的数据展示也只是在<div id=app>这个层次下data(){} //data本质上是一个对象
    })
  • template标签下只能有一个根节点
  • {{meg或者函数}}。函数必须带括号,否则会被认为是data(){}下的属性---{{naem()}}。在v-on:click中函数不传参数可以不写括号【v-on:click="name"】,计算属性不传参,所以不使用括号;要传参数则带括号【v-on:click="name()"】。
  • 可以直接进行逻辑运算{{5+5}}

    {{ ok ? 'YES' : 'NO' }}

每个绑定都只能包含单个表达式


一、指令是带有 v- 前缀的特殊属性。

指令用于在表达式的值改变时,将某些行为应用到 DOM 上

例如:v-if="true/false",直接对dom操作,控制标签文本的显示隐藏;v-show="",是对css样式display="block/none"的显示和隐藏

  • 1、v-on 指令,它用于监听 DOM 事件:
  • 2、v-model指令,input、select/textarea checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值

HTML 属性中的值应使用 v-bind 指令。

  • 3、v-bind:href=""可以简写为:href=""
  • 4、v-bind:class=""动态绑定css样式
  • 5、v-html=""动态插入html文本
  • 6、v-else 和v-else-if元素必须紧跟在 v-if 元素或者 v-else-if的后面——否则它不能被识别。
  • 7、v-for 循环指令。

v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名

v-for 循环时的 key 值是引用类型(对象或者数组),key只接收字符串或者numbe

<el-option v-for="item in cities" :key="item.id" ...>{{item.属性名}}</el-option>

- 修饰符是以半角句号 .

  • 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():

- 鼠标事件

  • vue鼠标双击事件v-on:dblclick=""
  • 鼠标事件
    <div id="canvas" v-on:mousemove="updateXY">
      {{x}},{{y}}
    updateXY: function(event){
      console.log(event);   //event是js的鼠标事件,offsetX、offsetY是鼠标的坐标
      this.x=event.offsetX;
      this.y=event.offsetY;
    },
  • 让鼠标在某一区域停止获取坐标:

    方法一:
    <span @mousemove="stopMoving">Stop Moving</span>
    stopMoving: function(event){
      event.stopPropagation();
    },

方法二:

<span @mousemove.stop="">Stop Moving</span>
  • 键盘事件v-on:keyup="自己定义函数事件";ref="name",用来标记html标签,以便获取到键盘输入的值---用法:this.$ref.name.value
  • 数据双向绑定(/imput/delect/textarea)v-model="name"----name为data(){}中定义的变量。v-model绑定了data中的name属性,及name的值会显示到view;v-model变化会影响到name的值

传值

属性传值

  • v-bind:自定义属性="data中的users",
    例如:
<HelloWorld v-bind:users="users"></HelloWorld>

在app.vue中data()下定义属性users数组对象,然后在HelloWorld.vue中写入

props:{
    users:{
      type:Array,
      required:true,

在HelloWorld中就可以正常使用父组件app.vue中data的数据

  • vue规范写法
    props:{
     属性名{
         type:String/number/boolean
     }
 }
    props:{
     属性名、对象名:{
         type:Array,
        required:true,
        default:  //1、使用default定义默认值时,如果父组件有传值,则用父组件的渲染;如果父组件没有传值,则使用默认值
        //2、没有定义默认值时,如果父组件有传值,则用父值渲染。如果父组件没有传值,则使用的是该类型的默认值。类型及其默认值如下:

String ''

Number 0

Array []

Object {}
     }
 }

传值---string、number、boolean

传值----改变一个地方的数据,其他地方的数据不会发生改变

引用----array、object

传引用---改变引用一个地方的数据,与这个引用相关的数据都会发生变化

prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。

事件传值--子传父

第一步:在子组件header里面定义一个点击事件changeString,在事件changeString中都调用$emit('定义一个父组件属性','需要传递给父组件的值');

第二步:父组件home里面header标签里面使用v-on:titleChanged="updataTitle(event)",绑定子组件里面定义的父组件属性给一个函数updataTitle('event'),$event是子组件传递过来的值。再者在updataTitle函数中接收子组件传递过来的值并赋予给父组件定义将传递给子组件的属性itemHeader。最后就是父组件传值给子组件,即可实现

Header子组件
html:
    <header>
         <h1 @click="changeString">{{title}}---{{item}}</h1>
    </header>
    
js:
    changeString(){
      console.log('here 1');
      this.$emit('titleChanged','这是子组件想要改变的值')
    },
    
home父组件
html:
     <Header v-on:titleChanged="updataTitle($event)" v-bind:item="itemHeader"></Header>
js:
    updataTitle(i){
      console.log('here 2')
      this.itemHeader=i;
    }

- 生命周期

创建期间:

1、 beforeCreat------------vue还没有实例化之前。可以做一些加载动画。
2、 created-------vue实例、组件创建好了,data、methods已经初始化了,但是dom没有生成,此时页面并没有展示出来。现在可以请求网络接口获取数据,赋给属性

若是要调用methods的函数或者操作data里面的数据,最早只能在created中操作

  • 开始建测vue对象的el属性,或者是检测new vue({el:....}).==$mount("#app")==
  • 检测template,
  • 从created结束至beforeMount开始期间,表示vue开始编译模板,把执行vue代码中的指令,最终在内存中生成一个编译好的最终模板字符串,然后把这个模板字符串渲染为内存中的虚拟DOM。此时只是在内存中渲染好了模板,并没有把模板挂载到页面内

3、 beforeMount---模板已经编译完成(template里面的内容),挂载到虚拟DOM里面,当前还看不见页面

  • 把template里面的东西放入el:#app里面

4、mounted---开始挂载,这个方法一旦结束之后我们的页面就加载出来了----获取数据是在这个方法执行完成后再去获取

运行期间:这两事件,会根据data数据的改变,有选择性的出发0到多次

1、beforeUpdate ---组件更新之前调用的函数,页面未更新,页面显示的数据还是旧的,但是data中的数据是最新的,页面尚未和data数据同步

2、update----组件更新完成后执行,渲染新的页面

销毁期间:

1 、beforeDestroy----组件销毁前。当执行beforedestroy钩子函数时,,实例上所有的data、methods、过滤器以及指令等都处于可用状态。此时还没有执行真正的销毁过程

2、 destroyed----组件销毁。实例上所有的data、methods、过滤器以及指令等都不可用。


vue路由

- 路由规则传参query:

html:
<router-link to="/login?123&jack">登录</router-lonk>
router设置:{
        path:'/login',
        component:Login 
js:
created(){
    console.log(this.$router);
    console.log(this.$router.query.id);
}

- 路由规则传参params:

html:
<router-link to="/login/123/jack">登录</router-lonk>
router设置:{
        path:'/login/:id/:name',
        //:号是占位符
        //在this.$router中,matchedd里面的path(路由设置里面的path)预解析为一个正则表达式,再用正则表达式去解析fullPath(router-link里面to属性的path),将结果传到params对象里面
        component:Login 
js:
created(){
    console.log(this.$router);
    console.log(this.$router.params.id);
}

路由实现布局


http请求(vue-resource,实际上是promise):npm install vue-resource --save-dev

get、delect、head、json请求:

html:
        ---http请求---
    <input type="button" value="get请求" @click="getInfo">
js:
    methods:{
            getInfo(){
      this.$http.get('http://api.cms.liulongbin.top/api/getlunbo').then(function (result){
        console.log(result.body);
        //get()里面放请求地址;then里面是一个匿名函数,其中有两个参数,第一个是成功的回调这个是必要的;第二个是失败的回调,这个是非必要的,可以不写
        // 通过result.body拿到服务器返回的成功的数据
      })
    }
    }

post、put请求:

html:
        ---http请求---
    <input type="button" value="post请求" @click="posttInfo">
js:
    methods:{
            postInfo(){
      this.$http.post('请求地址url' , { } , {emulateJSON:true } ).then(function (result){
        console.log(result.body);
        //1、手动发起的post请求,默认没有表单格式化,所以,有的服务器处理不了
        //2、post()里面三个参数,第一个是请求地址URL,第二个是传输的数据name:this.name,
        //第三个是设置提交的内容为普通表单数据格式{emulateJSON:true },以普通表单格式,将数据提交给数据库,application/x-www-form-urlencode
        //在post分分钟,使用.then 来设置成功的回调函数;如果想拿到成功的结果,需要 result.body
      })
    }
    }
 - http请求详细:https://github.com/pagekit/vue-resource/blob/develop/docs/http.md

数据监听

方式一:input、select、textarea、checkbox、radio 等标签,先用v-model双向绑定数据,然后设置keyup事件getFullName,

html
    <label>firstName</label>
    <input type="text" v-on:keyup="getFullName" v-model="first">+
    <label>lastName</label>
    <input v-on:keyup="getFullName" v-model="last">
   =<input v-model="name">
   
  js
  methods:{
      getFullName(){
      this.name=this.first+'-'+this.last;
    },
    }

方式二:使用watch:{}。watch可以监听data(){}对象中的数据,在watch中使用属性名作为方法名。watch是一个对象,和data(){}对象同级

html
        <label>firstName</label>
      <input type="text" v-model="first">+
      <label>lastName</label>
      <input v-model="last">
     =<input v-model="name">
     
js
   watch:{
    first: function(newVal,oldVal){
      this.name=newVal+this.last;
    },
    last: function(newVal){
      this.name=this.first+newVal;
    }
<!--方法名中若出现-符号,则方法名须使用引号包起来-->
  }
  • keyup和watch的区别:keyup只能监听DOM元素中的数据,而watch既可以监听DOM元素的数据又可以监听路由的改变
html
        <ul>
      <!--      href=""的值绑定的是路由的地址-->
      <li><router-link to="/home">Home</router-link></li>
      <li><router-link to="/index">index</router-link></li>
    </ul>
<!--    将组件挂载到DOM,由vue-router提供的元素,可以视为一个容器,展示路由规则匹配到的组件-->
    <router-view></router-view>

js:
    watch:{
    '$route.path':function(newVal,oldVal){
      console.log(newVal+'---'+oldVal);
      if(newVal==='/home'){
        alert('welcome to home')
      }else if(newVal==='/index'){
        alert('welcome to blogs')
      }
    }
  },
  //注意:watch和data(){}对象同级

- 计算属性computed、watch和methods的区别:

computed:本质是一个方法对象,只不过使用的时候把他的名字当作属性来用

  • 1、计算属性在使用的时候,一定不要加(),因为他是属性
  • 2、计算属性的function内部所用到的任何data(){}对象中的数据发生变化,就会重新计算这个计算属性的值;若计算属性方法中的任何数据都没有发生变化,则不会对计算属性重新求值
  • 3、计算属性求值的结果会被缓存起来,方便下次直接使用;
  • 4、计算属性必须要return出去一个东西,适合做一些简单的数据操作

methods:methods每次模板编译都会执行【created的()进行数据定义是第一次】,调用函数也会重新执行一次

  • 1、methods适合做大量的业务逻辑处理

watch:是一个键值对象,比较适合去监听一些虚拟的东西(路由)

  • 1、键是需要观察的表达式,值是对应的回调函数。主要用来监听特定数据的变化,从而进行某些具体的逻辑业务操作;可以看作 是computed和methods的结合体
-详见DemoT.vue文件

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

推荐阅读更多精彩内容

  • vue基础 --- #### 小知识(老陈vue) * 1、在node.js/npm相当于java中的maven...
    大脸妹m阅读 238评论 0 0
  • ### 什么是Vue.js + Vue.js 是目前最火的一个前端框架,React是最流行的一个前端框架(Reac...
    JLong阅读 1,075评论 0 0
  • Vue基础语法 内容概述 插值操作 绑定属性 计算属性 事件监听 条件判断 循环遍历 阶段案例 v-model 一...
    songstar阅读 488评论 0 0
  • 一、Vue起步 MVVM模式(Model-View-ViewModel)ViewModel是Vue.js的核心,它...
    jiahzhon阅读 175评论 0 0
  • 一、简单介绍 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 学习此框架你...
    运维开发_西瓜甜阅读 1,014评论 0 12