Vue 成长之旅 | Vue基础用法一

一、Vue 基础使用

<body>
  <div id="app">
      <p v-text="username"></p>
 </div>
</body>
 <script src="./vue.js"></script>
<script>
// 引用vue js框架后, 浏览器加载完毕vue 框架,window全局就有了一个Vue的构造函数
// 创建Vue 实例对象
const vm = new Vue({
    // el属性是固定的写法,表示当前vm实例要控制页面上的哪个区域,接收的值是一个选择器
    el: '#app',
    data: {
        username: '张三'
    }
})
</script>

二 、 Vue的指令与过滤器

1、指令的概念

指令: 是vue为开发者提供的模板语法 , 用于辅助开发者渲染页面的基本结构。

Vue中的指令按照不同的用途可以分为如下6大类:

1)、内容渲染指令

内容渲染指令用来辅助开发者渲染DOM元素的文本内容 , 常用的内容渲染指令有如下3个:

1》 v-text;

// v-text 代表把变量值渲染到 标签的内容区域(会覆盖标签内部内容)
<div id="app" v-text="username"></div>
//  会覆盖p标签原有内容
<p v-text="gender">性别</p>

2》{{ }} 插值表达式
Vue 提供的{{ }} 表达式 , 只是内容的占位符,不回覆盖原有内容。

// 只替换占位符的内容
<p>性别:{{ gender }}</p>

// 插值表达式,也支持javascript表达式的运算。
 {{ flag ? "YES":"NO"}}

3》v-html
可以把带有标签的字符串, 渲染成真正的 html

data: {
        username: '张三',
        gender : '女',
        info:'<div style=\'color:red\'>sssss</div>'
    }
// 会把文本内容 , 直接显示成文本, 而不认识html标签
<p v-text="info"></p>
// 会识别html 标签,并识别
<p v-html="info"></p>

2)、属性绑定指令

插值表达式只能用于内容节点中, 不能用于属性节点中。
如果要给某个属性,动态绑定值,可用 v-bind 指令,直接在某个属性前面加v-bind: 即可。同时这个指令可以简写成 “:”
// 这两种写法都可以
<input v-bind:placeholder="tip"/>
<input :placeholder="tip"/>

属性表达式里面, 也支持简单的表达式运算
// 在data 中定义了 index变量,如果告诉vue , 要查找一个叫 index的变量
// 如果在属性绑定指令中,运用表达式,则把固定的字符串用单引号括起来,然后用 + 拼接变量即可 。 实例如下: 
<div :id="'id_'+index" :title="'id_'+index">aaaa</div>

3)、事件绑定指令

要想绑定事件,先在Vue构造函数中, 添加: methods 属性,并在methods 对象中添加方法

const vm = new Vue({
    // el属性是固定的写法,表示当前vm实例要控制页面上的哪个区域,接收的值是一个选择器
    el: '#app',
    data: { count : 1 }
    methods:{
        // 这里可以使用简写的方式,去掉 :function 即可
        myclick :function(n) {
            // 这里vm ,可以使用this 替代,即:this.count += n
            vm.count += n
        },
        myclick1 (n,e) {
            this.count += n
            if(this.count % 2 == 0){
                e.target.style = "background:red"
            }else{
                e.target.style = "background:yellow"
            }
            console.log("================",e)
        }
    }
})

// 然后在元素中 click 属性绑定这个方法,也可以简写方式:
<button v-on:click="myclick(3)">click</button>
// 简写
<button @click="myclick(3)">click</button>

<!--vue 提供了一个内置对象:$event , 代表的就是原生事件对象 , 如果不传自定义参数,自带了原生事件对象-->
<button @click="myclick1(1, $event)">click</button>
事件修饰符

在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。
event.preventDefault() 这个是停止默认事件处理流程

//  阻止单击事件继续传播 
<a v-on:click.stop="doThis"></a>
// 提交事件不再重载页面 ,
<form v-on:submit.prevent="onSubmit"></form>

4)、双向绑定指令

示例
<p>用户名:{{ username }}</p>
// 通过v-model 指令进行双向绑定 , v-model 在底层监听的就是value属性
<input v-model="username" />
// 通过v-bind 属性绑定, 也可以显示数据,但是当input内容变化时,变量不会变化
<input :value="username"/>
// 通常情况下,可以用 v-model 替换 v-bind:value
v-model 修饰符
v-model.number
<input type="text" v-model.number="n1"/> +  <input type="text" v-model="n2"/> = <span>{{n1 + n2}}</span>
// 如果不做限制,input 可以输入任意字符串,有时候我们只允许用户输入数字,那么就可以修饰符的方式控制。
v-model.trim
<input type="text" v-model.trim="username"/>
// 用户在输入框 中字符串前后输入空格,会被自动清理
v-model.lazy
<input type="text" v-model.lazy="username"/>
// 默认情况下,输入框的内容变化会实时同步到变量中,但有时候,我们只需要在输入框失去焦点的时候,才去监听内容。

5)、条件渲染指令

v-if

如果条件是true ,就加载元素,否则就不会解析加载元素

v-show

如果条件是true, 浏览器也会解析元素,但是会把元素隐藏

6)、列表渲染指令

v-for
基础使用,在想要循环生成的元素标签上加上 v-for 指令即可

list:[
        {id:1,name :'张三'},
        {id:2,name :'李四'},
        {id:3,name :'王五'},
    ]
...
<li v-for="item in list">
    {{item.name}}
 </li>
// 添加一个列表索引 , 用到了索引 index , 就要添加一个:key 属性绑定,并绑定索引 , 且:key 的值只能是 数字或者字符串,且值不能重复
<li v-for="(item,idx) in list" :title="'id_'+item.name + '_' +idx"  :key="idx">
    {{item.name}}
</li>

key的注意事项

key的值只能是字符串或数字类型
key的值必须具有唯一性
建议把属性的id属性的值 作为key的值
建议使用v-for指令时,一定要指定key的值
使用index的值当作key的值 没有任何意义

2、过滤器

需要注意的点

过滤器在Vue3.x中已经被作废,
过滤器只用于 插值表达式和 v-bind 属性绑定指令 中
过滤器 由管道符 进行调用
过滤器函数必须有返回值,最后显示的是过滤器函数的返回值
在过滤器的第一个形参就能拿到 实际参数
过滤器函数,必须声明在 filters 属性中(与data、methods 同级)

三、侦听器

侦听变量变化

1、 函数格式的侦听器

<div id="app">
  <input type="text" v-model="username">
</div>
const vm = new Vue({
    el: '#app',
    data: {
        username: '张三',
    },
    // 所有的侦听器 , 都要定义在watch 属性节点下面
    watch :{
        // 本质上是一个函数, 要侦听哪个变量,就用这个变量作为方法的名称
        username(newVal , oldVal){
            console.log("=============newVal  ---oldVal", newVal, oldVal)
        }
    }
})
缺点:

1、进入页面不会自动触发侦听器
2、如果侦听的是一个对象 ,如果对象中的属性发生了变化,不会触发侦听器

2、属性格式侦听器

<div id="app">
  <input type="text" v-model="info.username">
</div>
const vm = new Vue({
    el: '#app',
    data: {
        info:{
            username: '张三',
        }
    },
    // 所有的侦听器 , 都要定义在watch 属性节点下面
    watch :{
        username:{
            // 里面的方法名称必须是 handler , 否则报错
            handler(newVal , oldVal){
                console.log("=====newVal  ---oldVal", newVal, oldVal)
            },
            //  immediate 默认值是false , 作用是:控制侦听器是否立即执行
            immediate : true   ,
            // deep 默认值是 false , 开启深度侦听 , 只要对象中的任何属性发生变化,就会触发
            deep:true
        }

        // 侦听对象中的某个属性,需要用单引号括起来,这样只会侦听指定的属性
        'info.username':{
            handler(newVal , oldVal){
                console.log("==========newVal , oldVal" , newVal , oldVal)
            },
        }
    }
})

好处:

1、可以通过immediate 控制,是否立即侦听
2、可以通过deep 控制,是否要深度侦听
3、可以侦听对象中的某个具体属性的变化

三、计算属性

通过一些列运算后, 得到一个属性值,这个计算得到的属性值, 可以在模板结构或methods 方法中使用

const vm = new Vue({
    el: '#app',
    data: {
        r: 0,
        g: 0,
        b: 0,
    },
    // 所有的计算属性都要放在 computed 节点中
    computed: {
        // 计算属性要写成函数的形式
        rgb() {
            return `rgb(${this.r},${this.g},${this.b})`
        }
    }
})
// 通过打印vm 对象, 可以发现vm多了一个 rgb 的属性
console.log("=====", vm)

计算属性 与 侦听器的区别

1、computed 是同步的, watch 可以实现异步
2、computed 必须有返回值, watch 里面的函数可以不写返回值
3、同时侦听多个属性变量时,尽量用计算属性

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

推荐阅读更多精彩内容