前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅谈Vue--直接引入Vue.js实现简单地开发

浅谈Vue--直接引入Vue.js实现简单地开发

作者头像
生南星
发布2019-07-22 14:29:38
7.5K0
发布2019-07-22 14:29:38
举报
文章被收录于专栏:生南星生南星

1. Vue介绍

Vue是一个MVVM的JavaScript框架; ViewModel负责逻辑的实现,把Model里的数据传递给View,实现视图层与数据层的解耦

2.Vue的开发方式: 2.1 通过直接引入Vue.js实现简单地开发

引入vue.js文件: <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

基本框架:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>基本框架</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
    <div id="app"></div>
    <script type="text/javascript">
        let app = new Vue({
           el:'#app',
           data:{},
           methods:{},
        });
</script>
</body>
</html>

2.2 使用Vue CLI脚手架工具进行开发

3. Vue的数据绑定

3.1 值绑定

3.1.1 {{}} -- 插值表达式

代码语言:javascript
复制
<h2>{{msg}}</h2>

//script里的data
data:{
msg:'Hello, Vue!',
},

3.1.2 使用 v-text 和 v-html 进行数据绑定

注意 -- v-text和v-html的区别: v-text会将数据原样输出(插值表达式也会将数据原样输出) v-html如果数据里有标签,会将其解析在输出

文本闪烁问题: 当我们使用外部引入vue.js的方式进行开发时,如果vue.js文件没有及时加载,导致系统无法识别vue的语法,原vue语法会原样输出 解决办法: 1.在head标签里引入vue.js文件 2.使用v-cloak指令专门用来解决文本闪烁问题. 我们自己会给添加了v-cloak指令的元素设置 display:none;先让其元素隐藏,等到vue.js文件加载之后v-cloak起效果,会将之前隐藏的元素 display设置为 block.

3.2 属性绑定

在vue里,属性不区分HTML属性和DOM属性

3.2.1 语法: v-bind: 属性名='值' 简写为 :属性名='值'

3.2.2 动态绑定元素样式

动态绑定class属性 -- :class='对象/数组'

动态绑定style属性 -- :style='对象/数组'

代码语言:javascript
复制
<style type="text/css">
      [v-cloak] {
          display: none;
      }
        img{
            width: 600px;
            height: 300px;
        }
        .bgc{
            background-color: #fff6d6;
        }
        .fontS{
            font-size: 25px;
        }
        .fontC{
            color: red;
        }
</style>

<body>
  <div class="div1" :class="{bgc:true,fontC:true}">
     class属性绑定值是对象
  </div>
  <div class="div1" :class="['bgc','fontS','fontC']">
      class属性绑定值是数组
   </div>
    <p :style="{width:'200px',height:'200px',backgroundColor:'#B6CCC8'}">
       style属性绑定对象
    </p>
    <p :style="[{width:'200px'},{height:'200px'},{backgroundColor:'#B6CCC8'},{border:'1px solid black'}]">
       style属性绑定数组
    </p>
</body>

3.3 事件绑定 语法 -- v-on: 事件名='表达式', 如果值是 '函数名()',小括号可加(传参)可不加(不传参) 简写-- @事件名='表达式'

vue的事件修饰符 1.普通事件 stop:阻止事件的传播 prevent:阻止默认事件的执行 once:一次性事件 2.键盘事件

代码语言:javascript
复制
<h3>普通事件</h3>
<div @click="parentClick">
    <button @click.stop="btnClick">子级按钮</button>
    <a href="http://www/baidu.com" @click.prevent>点击跳转百度</a>
    <button @click.once.stop="onceClick" :disabled="disAble">一次点击</button>
</div>

<h3>键盘事件</h3>
<input type="text" @keyup.left.right="keyInput">


//script里的methods
     methods:{
         parentClick(){
             alert('父级事件被触发!')
          },
          btnClick(){
             alert('子级事件被触发!')
          },
          onceClick(){
              this.disAble=true
          },
          keyInput(){
              console.log('键盘抬起!')
           }
      }

3.4 双向数据绑定

v-model='变量'

代码语言:javascript
复制
<!--双向数据绑定-->
        <fieldset>
            <legend><h1>双向数据绑定</h1></legend>
            <input type="text" v-model="inputV">
            <p>{{inputV}}</p>
        </fieldset>
        
//script里的data
data:{
   inputV:'默认值',
},

4. Vue指令

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>指令</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <!--
        1.v-if 控制元素的显隐
            v-if和v-show的区别:
            v-if真正意义上从dom树种移除或者增加元素
            v-show只是控制元素的display样式
        -->
        <h2 v-if="false">我是v-if的h2标签</h2>
        <h2 v-show="false">我是v-show的h2标签</h2>
        <hr/>
        
        <!--
        2.v-for 列表渲染
            语法:
            v-for='(集合里的值,下标) in 集合'
        :key  vue是虚拟DOM,设置key可以提高浏览器的渲染效率,key的值一般给数据里能起到唯一标识作用的值,如果没有,也可以给index
        -->
        <ul>
            <li v-for="(per,index) in infoArr" :key="index">
                <span>这是第{{index+1}}个人的信息</span>
                <span>{{per.name}}</span>
                <span>{{per.age}}</span>
                <span>{{per.sex}}</span>
            </li>
        </ul>
        
        <!--
        结合template标签实现v-for的列表渲染
        template标签在渲染时不会被加载
        template标签不能加key属性
        -->
    
        <ul>
            <template v-for="(per,index) in infoArr">
                <span>这是第{{index+1}}个人的信息</span>
                <span>{{per.name}}</span>
                <span>{{per.age}}</span>
                <span>{{per.sex}}</span>
            </template>
        </ul>
    </div>
    
    <script type="text/javascript">
        let app = new Vue({
            el:'#app',
            data:{
                infoArr:[
                    {name:'阿音',age:22,sex:'女'},
                    {name:'朱一龙',age:31,sex:'男'},
                    {name:'白宇',age:29,sex:'男'},
                    {name:'李白',age:50,sex:'男'},
                    {name:'纳兰容若',age:40,sex:'男'}
                ]
            },
            methods:{
            
            }
        })
</script>
</body>
</html>

5. Vue数组和对象的监测

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>数组和对象的监测</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <ul>
            <li v-for="v in dataArr">{{v}}</li>
        </ul>
        <ul>
            <li v-for="item in perArr">{{item.name}}</li>
        </ul>
        <button @click="btnClick">点击</button>
        <button @click="changeV">点击改变数组里的值</button>
        <button @click="changePerV">点击改变per数组里的值</button>
        <hr>
        <p v-for="(value, key) in person">{{value+'---'+key}}</p>
        <button @click="person.age = 50">点击修改person的age</button>
        <button @click="addKV">点击添加键值对</button>
        <button @click="replacePerson">点击整体替换person</button>
        <button @click="deleteHobby">点击删除hobby</button>
    </div>
    <!--
    关于vue里数组和对象的监测:
    1.数据的更新监测
        以下方法操作数组,都可以引起页面的直接更新渲染
        push,pop,unshift,shift,splice,sort,reverse
        
        以下方法操作数组,不会引起页面的直接更新渲染,除非再给原数组重新赋值一遍
        filter,map,concat,slice
        
        只修改数组里的值,也不会引起页面的重新渲染
        解决办法:
        写法1:Vue.set(数组,下标,新值);
        写法2: Vue实例,$set(数组,下标,新值)
        
     2.对象的监测
        通过已有的key更新value或者直接整体替换对象都可以引起页面的更新渲染,但是给对象新增键值对不会引起页面的更新渲染
        
        解决方法:
        写法一: Vue.set(对象,新key,新value)
        一次添加多个键值对
        Object.assign({},对象,{多个键值对})
        
        写法二:
        Vue实例.$set(对象,新key,新value);
        
        删除键值对
        写法1: Vue.delete(对象,key)
        写法2: Vue实例.$delete(对象,key)
    -->
    <script type="text/javascript">
        let app = new Vue({
            el:'#app',
            data:{
                dataArr:[1, 2, 3, 4, 5],
                perArr:[
                    {name:"abc"},
                    {name:"def"},
                    {name:"ghi"}
                ],
                person:{
                    name:'蔡徐坤',
                    age:20,
                    sex:'男',
                    hobby:'篮球,rap'
                }
            },
            methods:{
                btnClick() {
                    this.dataArr = this.dataArr.filter(function (v) {
                        return v > 3;
                    })
                },
                changeV() {
                    //不能实现
                    // this.dataArr[0] = 100;
                    Vue.set(this.dataArr,0,100);
                },
                changePerV() {
                    //能实现
                    // this.perArr[0].name = "阿音";
                    //不能实现
                    // this.perArr[1] = {name:'阿音'};
                    app.$set(this.perArr,1,{name:'阿音'});
                },
                addKV() {
                    //不能实现
                    // this.person.id = '队长';
                    // console.log(this.person);
                    
                    // Vue.set(this.person,'id','队长');
                    
                    // this.person=Object.assign({},this.person,{id:'对象',team:'NBA'});
                    
                    // this.person={...this.person,id:'对象',team:'NBA'};
                    
                    app.$set(this.person,'id','啦啦队');
                },
                replacePerson() {
                    this.person = {name:'吴亦凡', hobby:'rap', project:'你看这个碗它又大又圆'};
                },
                deleteHobby(){
                    Vue.delete(this.person,'hobby');
                }
            }
        })
</script>
</body>
</html>
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生南星 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档