<div class="box">
<!-- 3. {{对象名}} 为插件表达式 插入vue实例数据 -->
<h1>Hello, {{name.toUpperCase()}} {{age}}</h1>
</div>
// 1. 设置为false 以阻止vue在启动时生成生产提示
Vue.config.productionTip = false
// 最好在配置调整好后 在继续写Vue代码
// 2. 创建vue实例 {} 是配置对象
new Vue({
el: '.box', // el是指定当前vue实例为哪个容器服务 值为css选择器
data: { // data是存储数据的 为指定容器使用
name: '小城故事xc',
age: 18
}
})
<div class="box">
<h1>插值语法</h1>
<h2>你好, {{name}}</h2>
<hr>
<h1>指令语法</h1>
<a v-bind:href="url" v-bind:x="age">百度搜索</a>
<!-- 简写指令 -->
<a :href="url" :x="age">{{all.name}}</a>
</div>
new Vue({
el: '.box',
data: {
name: 'jack',
url: 'https://baidu.com',
age: 18,
all: {
name: '小城故事'
}
}
})
<div class="box">
<!-- 普通写法 -->
单项数据绑定: <input type="text" v-bind:value="name"><br>
双项数据绑定: <input type="text" v-model:value="name"><br>
<!-- 简写 -->
单项数据绑定: <input type="text" :value="name"><br>
双项数据绑定: <input type="text" v-model="name">
<!-- 下面代码是错误的 v-model只能应用在表单元素上(输入类元素) -->
<!-- <h2 v-model:x="name">你好</h2> -->
</div>
new Vue({
el: '.box',
data: {
name: '小城故事'
}
})
let v = new Vue({
// el: '.box',
data:function () { // data函数式写法
console.log(this) // 指向vue实例对象
return {
name: '小城故事'
}
}
})
// 01. el的两种写法
// 1. 第一种写法: el: '.box'
// 2. 第二种写法: $mount
console.log(v)
// 配合定时器使用
setTimeout(() => {
v.$mount('.box')
}, 500)
// 02. data的两种写法
// 1. 第一种写法: 对象式 data: {}
// 2. 第二种写法: 函数式 组件化会用到
<div class="box">
<h1>你好, {{name}}</h1>
<h4>测试一下: {{1+1}}</h4>
<h4>测试一下: {{$options}}</h4>
<h4>测试一下: {{$emit}}</h4>
</div>
let vm = new Vue({
el: '.box',
data: {
name: '小城故事'
}
})
console.log(vm)
let num = 18
let obj = {
name: '小城'
}
Object.defineProperty(obj, 'age', {
// value: 18,
// enumerable: true, // 控制属性是否可以枚举 默认false
// writable: true, // 控制属性是否可以被修改 默认false
// configurable: true, // 控制属性是否可以被删除 默认false
// 数据代理 当读取obj的age属性时, get函数会被调用, 且返回值是age的值
get() {
console.log('你读取了age属性')
return num
},
// 数据劫持 当修改obj的age属性时, set函数会被调用, 且会收到修改的具体指
set(value) {
console.log('你修改了age属性, 且值为', value)
return num = value
}
})
console.log(obj)
console.log(Object.keys(obj))
let obj = {x: 10}
let obj1 = {y: 20}
Object.defineProperty(obj1, 'x', {
get() {
return obj.x
},
set(value) {
obj.x = value
}
})
console.log(obj)
console.log(obj1)
<div class="box">
<h1>你好, {{name}}</h1>
</div>
let vm = new Vue({
el: '.box',
data: {
name: '小城故事'
}
})
console.log(vm)
<div class="box">
<h1>你好, {{name}}</h1>
<button v-on:click="show">点击我啊</button>
<!-- 简写 -->
<button @click="show">点击我啊 (不带传参)</button>
<button @click="show1($event, 666)">点击我啊 (带传参)</button>
</div>
el: '.box',
data: {
name: '小城故事'
},
methods: {
show(e) {
console.log(e.target)
console.log(this) // 指向vm实例对象
alert('你好')
},
show1(event, number) {
console.log(event, number)
alert(`你好, ${number}`)
}
}
})
<div class="box">
<h3>你好, {{name}}</h3>
<!-- 1. 阻止事件默认行为(常用) -->
<a href="https://baidu.com" @click.prevent="show">点我提示信息</a>
<!-- 小技巧: 修饰符可以连续写入: 阻止默认行为和阻止冒泡 -->
<a href="https://baidu.com" @click.prevent.stop="show">修饰符可以连续写入</a>
<!-- 2. 阻止事件冒泡(常用) -->
<div class="demo" @click="show">
<button @click.stop="show">阻止事件冒泡</button>
</div>
<!-- 3. 事件只触发一次(常用) -->
<button @click.once="show">点我只触发一次</button>
<!-- 4. 使用事件的捕获模式 -->
<div class="demo1" @click.capture="show1(1)">
使用事件的捕获模式
<div class="demo2" @click="show1(2)">
使用事件的捕获模式
</div>
</div>
<!-- 5. 只有e.target是当前操作的元素时才触发事件 -->
<div class="demo" @click.self="show">
<button @click="show">e.target阻止事件冒泡</button>
</div>
<!-- 6. 事件的默认行为立即执行, 无需等待事件回调完成 -->
<ul @wheel.passive="show2">
<li>1</li>
<li>2</li>
</ul>
</div>
new Vue({
el: '.box',
data: {
name: '小城故事'
},
methods: {
show(e) {
// e.preventDefault() vue里这样写: prevent
// e.stopPropagation() vue里这样写: stop
alert('你好')
},
show1(msg) {
console.log(msg)
},
show2() {
for (let i = 0; i <= 100000; i++) {
console.log(1)
}
console.log('累坏了')
}
}
})
<div class="box">
<h2>你好, {{name}}</h2>
<input type="text" placeholder="按下回车提示" @keyup.enter="show">
<!-- Ctrl虽然可配合其他键使用,但如果只能Ctrl+Y才能触发后面得.Y -->
<input type="text" placeholder="按下回车提示" @keyup.ctrl.y="show">
</div>
new Vue({
el: '.box',
data: {
name: '小城'
},
methods: {
show(e) {
// if (e.key !== 'Enter') return
console.log(e.target.value)
}
}
})
<div class="box">
姓: <input type="text" v-model="name"> <br><br>
名: <input type="text" v-model="names"> <br><br>
全名: <span>{{name.slice(0, 3)}} - {{names}}</span>
</div>
new Vue({
el: '.box',
data: {
name: '张',
names: '三'
}
})
<div class="box">
姓: <input type="text" v-model="name"> <br><br>
名: <input type="text" v-model="names"> <br><br>
全名: <span>{{fn()}}</span>
</div>
new Vue({
el: '.box',
data: {
name: '张',
names: '三'
},
methods: {
fn() {
console.log('fn函数被调用了')
return this.name + '-' + this.names
}
}
})
<div class="box">
姓: <input type="text" v-model="name"> <br><br>
名: <input type="text" v-model="names"> <br><br>
全名: <span>{{fullname}}</span> <br><br>
全名: <span>{{fullname}}</span> <br><br>
全名: <span>{{fullname}}</span>
</div>
let vm = new Vue({
el: '.box',
data: {
name: '张',
names: '三'
},
computed: {
fullname: {
// get作用: 当读取fullname时, get会被调用, 且返回值作为fullname的值
get() {
console.log('get被调用了')
console.log(this) // 指向vm实例 vue把get的this指向了vm
return this.name + '-' + this.names
},
// set什么时候调用: 当fullname被修改时调用
set(value) {
console.log(value)
let arr = value.split('-')
this.name = arr[0]
this.names = arr[1]
}
}
}
})
console.log(vm)
只有考虑读取, 不考虑修改才能用简写方式
<div class="box">
姓: <input type="text" v-model="name"> <br><br>
名: <input type="text" v-model="names"> <br><br>
全名: <span>{{fullname}}</span>
</div>
let vm = new Vue({
el: '.box',
data: {
name: '张',
names: '三'
},
computed: {
// 1. 简写
fullname() {
console.log('get被调用了')
return this.name + '-' + this.names
}
// 2. 完整写法
// fullname: {
// get() {
// console.log('get被调用了')
// return this.name + '-' + this.names
// }
// }
}
})