vueJs的简单入门以及基础语法

1)vue的基础语法介绍

vue的下载以及是什么这里就不说了,直接看vue官网
简单的说 这篇帖子只是把语法归类了

vue的api vue官网API

image.png

1-1基本数据绑定

<div id="app">
  {{ msg }}
</div>
//script
new Vue({
  el:"#app",//代表vue的范围
  data:{
    msg:'hello Vue' //数据
  }
})

在这个例子中我们可以进行赋值

var app = new Vue(...);
app.msg = '初探vue';
//那么页面的值就被改变了

1-2 v-html命令

<div id="app" v-html="msg">
 
</div>
//script
new Vue({
  el:"#app",//代表vue的范围
  data:{
    msg:'<h1>你好,世界</h1>' //这里就不会是文本了 而是会被当成是html标签了
  }
})

1-3 v-on:click||@click指令

<div id="app">
<button v-on:clikc="clickHead">事件</button>
<button @click="clickHead">事件</button>
</div>

//js
new Vue({
  el:"#app",
  methods:{
    clickHead:functoin(){
      alert('vue的事件绑定')
     }

  }
})

//在es6语法中
对象中的函数可以
const json={
  clickHead(){
    //do something
  }
}
json.clickHead()调用方法

//和一样的
const json={
  clickHead:function(){
    //do something
  }
}

1-4 v-bind 属性绑定指令
例如绑定class 和id 已经已经存在的属性 和自定义属性

绑定类名

<div id="app">
  <p v-bind:class="className">{{msg}}</p> 
</div>
/*
v-bind 自定义名字
v-bind:id="..."  绑定id名字
v-bind:title="..."绑定title属性
v-bind:style="..." 绑定样式属性 
v-bind:...="..."绑定自定义属性
、、、
*/

//js
new Vue({
    el:"#app",
    data:{
        msg:'这是v-bind绑定数据',
        className:'contatiner'
    },
})
const Name = document.querySelector('.contatiner');
console.log(Name) //能正常的获取这个元素

1-5 v-show

根据值的真假 控制元素的display的属性

<div id="app">
 <p v-show="msg"> 可以看到啊 </p>
 <p v-show="msg1"> 不可以看到啊 </p> 
</div>

//js
new Vue({
  el:"#app",
  data:{
    msg:1+1==2,
    msg1:1+1!=2
  }
})

1-6 v-text

赋予文本值

<div id="app">
 <p v-text="msg"> 可以看到啊 </p> <!-- 最终会被替换掉 1+1==2 -->
</div>

//js
new Vue({
  el:"#app",
  data:{
    msg:'你好哈 v-text'
  }
})

1-7 v-for

循环

 <div id="app">
   <ol>
       <li v-for="module in modules">{{module.msg}}</li>
   </ol>
</div>

//js
new Vue({
   el:"#app",
   data:{
       modules:[
           {msg:'第一个'},
           {msg:'第二个'},
           {msg:'第三个'},
           {msg:'第四个'}
       ]
   }
})

1-8 v-model 双向数据绑定

<div id="app">
    <input type="text" v-model="msg">
    <p>{{msg}}</p>
</div>

//js
new Vue({
    el:"#app",
    data:{
        msg:''
    }
})

1-9 template属性

<div id="app">
    <span>你好啊</span>
</div>

//js
new Vue({
  el:"#app",
  data:{
    msg:'这是数据'
  },
  template:"<div>模板div</div>"
})

最终的效果是把id为app的div直接替换成template里面的元素


image.png

注意在template的值中不能含有兄弟根节点

new Vue({
  el:"#app",
  template:"<div>1<div><div>2<div>"
})

这样是错误的
在template 可以把团苏片段放在script标签内

<div id="app">
        <span>你好啊</span>
    </div>
    <script type="x-template" id="temp">  //这个地方就是模板片段
        <div id="tpl">
            <p> 这是模板啊,{{msg}} </p>
            <input type="text" v-model="msg" />
        </div>
    </script>
    <script src="js/vue.min.js"></script>
    <script>
        new Vue({
            el:"#app",
            data:{
                msg:''
            },
            template:"#temp"
        })
    </script>

2)vue实例中的属性

2-1 el

el表示在vue的实例中的作用范围

new Vue({
  el:"#app" //作用在id名为app的div上
})

2-2 data

data的属性就是数据绑定

new Vue({
  data:{
    msg:'数据的值'    
    arrayData:[
      {title:'这是1'}
    ]
  }
})

2-3 methods

methods绑定事件

new Vue({
  el:"#app",
  methods:{
    mouseClick(){
      alert('绑定事件')
    }
  }
})

2-3 template

template模板的绑定

new Vue({
  el:"#app",
  template:'<div>这是模板属性</div>'
})

2-4 render

render模板的绑定

new Vue({
    el:"#app",
    render(createElement){
        return createElement(
            "ol",
            {  //新创建的元素身上绑定属性
                style:{
                    fontSize:'30px',
                    border:'1px solid red',
                    fontWeight:'bold'
                },
                attrs:{
                    title:'你好啊',
                    coundNum:'01',
                    id:'ls',
                    class:'bg'
                }
            },
            [
                createElement("li",'这是第一个文本'),
                createElement("li",'这是第二个文本'),
                createElement("li",'这是第三个文本'),
            ]
        )
    }
})
image.png

3)vue的自定义指令

在vue中除了内置的指令如v-for、v-if...,用户可以自定义指令 官网

//这里定义v-focus
directives: {
  focus: {
    // 指令的定义
    inserted: function (el) {
      el.focus()
    }
  }
}

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

4)vue的扩展

4-1 v-bind根据条件绑定类名

案例 比如现在在true的情况下绑定red类名

<div id="app">
    <span :class="{red:addClass}">{{msg}}</span> <!--可以利用简单的表达式-->
<!--这是v-bind指令可以省略-->
</div>
<script src="js/vue.min.js"></script>
<script>
    new Vue({
        el:"#app",
        data:{
            msg:'条件绑定类名',
            addClass:true
        }
    })
</script>

4-2 v-on || @eventName 事件绑定 有一个事件修饰符

//阻止事件冒泡
<div v-on:click.stop="eventHadles"></div>
//阻止默认事件
<div v-on:click.prevent="eventHadles"></div>
//事件只能触发一次
<div v-on:click.once="eventHadles"></div>
//只能回车触发事件
<div @keyup.enter="eventHadles"></div>
//只能指定keyCode的值触发事件
<div @keyup.13="eventHadles"></div>

5)vue的计算属性 -computed

例如一个案例需要过滤一些列表


image.png

而我们需要利用v-for进行循环出来列表

需要用到我们的实例的属性
computed 说透点就是过滤你的数据根据你的条件进行过滤

//js
new Vue({
  el:"#app",
  data:{
    list:[
     {
        title:'你好啊',
        isChecked:true
     },
      {
        title:'你好啊2',
        isChecked:false
     }
    ],
    hash:'all' //过滤条件
  },
  computed:{ //重头戏 
      filterData(){ 
      //这个根据你的条件进行过滤 记住这个函数最终返回的是数据需要return 数据出来 不需要调用此函数
        let filterDatas = {
          all(list){
              return list
          },
          unfinshed(list){
            return list.filter(function(item){
                return !item.isChecked
            })
          },
          finshed(list){
              return list.filter(function(item){
                return item.isChecked
            })
          }
        }
        return filterDatas[你的条件]?filterDatas[你的条件](this.list):this.list
        //这里的你的条件可以使hash值 然后很久hash值的不同进行过滤 不需要调用这个函数
      }
  }
})
//然后在v-for的指令中
<div v-for="item in filterData"></div> <!--注意不是list了 而是刚刚的computed中的计算属性的函数名字-->

这里的hash的值可以参考我的另一片文章前端hash

6)vue的组件

6-1 底层学习组件

组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以表现为用 is 特性进行了扩展的原生 HTML 元素。

//html
<div id="app">
  <my-test></my-test> <!--自定义标签-->
</div>

//js
Vue.component('my-test',{  //注册组件
  template:'<div>初学组件</div>'       
});

new Vue({
  el:"#app"
})

6-2 父子组件通信

利用props进行传值

//局部组件
<div id="app">
  <my-test msg="你好"></my-test>
  <my-test msg="传值2"></my-test>
</div>
//js
new Vue({
  el:"#app",
  components:{
    'my-test':{
      props:['msg'],
      template:'<div>{{msg}}</div>'
    }
  }
})
//全局组件
<div id="app">
  <my-test msg="你好"></my-test>
  <my-test msg="传值2"></my-test>
</div>

//js
Vue.component('my-test',{
  props:['msg'],
  template:'<div>{{msg}}</div>'
})

如果需要传的值在vue的实例中

//html
<div id="app">
  <my-test v-bind:listData="list"></my-test>
</div>

//js
new Vue({
  el:"#app",
  data:{
    list:[
      {title:'这是数据'},
      {title:'这是数据22'}
    ]
  },
  components:{
    'my-test':{
      props:['listData'],
      template:`
        <select name="" id="">
          <option v-for="item in listData">{{item.title}}</option>
        </select>
      `
    }
  }
})

7)vue获取dom元素

在想获取的元素身上
<div class="container" rel="getDom">
//js
new Vue({
  el:"#app",
  methods:{
     _someDo(){
      this.dom = this.$refs.getDom;
    }
  },
  mounted(){
    this._someDo(); //vue完成挂载 调用函数
  }
})

8)vue渲染dom是异步$.nextTick()函数

因为vue渲染dom是异步的所以直接操作dom是会出错的
案例 例如 创建vue实例的时候请求接口数据,然后要进行dom元素操作

new Vue({
  data:{
    result:''
  },
  created(){
    axios.get('/data')
    .then(data=>{
      this.result = data.data  //如果在dom中用到了v-for这些元素 而我们乡操作这些元素
      this.$nextTick(()=>{
        //这个函数的意义就是等待dom渲染结束后执行
      })
    })
    .catch(err=>{
      //错误处理
    })
  }
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,048评论 0 29
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 11,015评论 4 129
  • 有时候,喜欢一首歌,不是因为歌唱得多好听,而是因为歌词写的像自己。音乐开心时听入耳,伤心时听入心;快乐的时候,听的...
    一支笔的陪伴阅读 558评论 3 4
  • 有一种渴望叫欲罢不能! 纠结两个字却描述了很多人有过的状态! 说起纠结就想起那初高中的作文课。那时候我还是一个对文...
    书痴姑娘阅读 271评论 0 1
  • 早在3、4年前就接触服务设计的概念,但那时觉得自己的定位很清晰,把页面设计得清晰好用就够了,服务设计似乎很虚,弄了...
    Ms_Foxy阅读 1,809评论 1 3