Correction status:Uncorrected
Teacher's comments:
导入方法和jq类似。<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
之后
<!-- 创建一个vue根节点 -->
<div class="app">
<!-- 那么这里的所有内容都可以用vue实例进行管理 -->
<!-- 插值就是一个数据占位符 -->
<p>用户名: {{username}}</p>
<p>{{username + ', php.cn讲师'}}</p>
<p>10 + 30 = {{ 10 + 30}}</p>
<p>{{flag ? '上午好' : '睡觉了'}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const vm = new Vue({
// 当前Vue的配置项
// 挂载点
// el: document.querySelector('.app') 可简写
el:'.app',
//
data:{
username:'张三',
flag:false,
}
})
如何查看data
// 查看
console.log(vm.$data.username);
// 在data中声明的所有变量都自动变成vue实例的属性
// 以上的过程就是数据注入
console.log(vm.username);
vm.username='李四';
<div class="app">
<p v-text="username">李四</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '.app',//不能挂在body和html上,它们有唯一性。
data: {
username: "张三",
},
})
v-text, v-html 在 html 中是不存在这样的属性的,它是专门由 Vue 实例管理的自定义属性,称之为“指令”。
v-text 指令 ====> innerText,textContent,它会覆盖掉原来的文本内容。p标签的李四会被张三覆盖
v-html
v-html 指令 ====> innerHTML, 它里边就不仅仅是纯文本了,还可以是 html 字符串
<div class="app">
<p v-html="username">李四</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '.app',
data: {
username: "<em style='color:red'>王五</em>",
},
})
</script>
v-bind 指令是一个高频指令,它的作用是动态地绑定一个或多个 属性,或一个组件 prop 到表达式。它可以简写成冒号 “:”。
<style>
.active {
color: violet;
}
.bigger {
font-size: 2rem;
}
</style>
<div class="app" >
<!-- 绑定style属性 -->
<p v-bind:style="style1">style: {{site}}</p>
<!-- v-bind:是高频指令可简写成冒号 -->
<p :style="`color:red`">style: {{site}}</p>
<!-- 绑定类class属性 -->
<p :class="`active bigger`">class1: {{site}}</p>
<p :class="class1">class2: {{site}}</p>
<!-- 控制样式的开关 -->
<p :class="{active: isActive, bigger: isBigger}">class3: {{site}}</p>
<p :class="[`active` ,`bigger`]">class4: {{site}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '.app',
data: {
site: 'php中文网',
style1: 'color:red',
class1: `active bigger`,
isActive: true,
isBigger: false,
},
})
</script>
v-on 指令:绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。
v-on 指令同样是一个高频指令,它可以简写成 “@”
<div class="app" >
<!-- 绑定事件 -->
<p><a href="https://php.cn" v-on:click="show">显示网站名称1</a></p>
<!-- 下面就阻止a标签的默认跳转行为 -->
<!-- 事件修饰符prevent:防止元素的默认行为 -->
<!-- v-on也是高频指令,可以简写为: @ -->
<p><a href="https://php.cn" @click.prevent="show">显示网站名称2</a></p>
<!-- stop:阻止冒泡 -->
<p><a href="https://php.cn" @click.prevent.stop="show">显示网站名称3</a></p>
<!-- 仅允许执行一次 -->
<p><a href="https://php.cn" @click.prevent.stop.once="show">显示网站名称仅一次</a></p>
<!-- 事件方法的传参 -->
<!-- 事件对象的参数名必须是 $event -->
<button @click.stop="handle($event, 100, 200)">click</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '.app',
data: {
site: 'php中文网',
style1: 'color:red',
class1: `active bigger`,
isActive: true,
isBigger: false,
},
methods: {
show() {
// this: 就是当前的vue实例对象
alert(this.site)
},
handle(ev, a, b) {
console.log(ev.type, ev.target);
console.log("%d + %d = %d", a, b, (a + b));
}
},
})
</script>
一般情况下页面上的数据都是响应式的,也就是单向绑定,就是页面中的数据随着 vue 实例中的数据变化而变化,而 v-model 指令的作用就是在表单控件或者组件上创建双向绑定。只要任何一方的数据发生变动,另一方的数据也会发生变化。
<div class="app">
<p>模型中的数据: {{site}}</p>
<p></p>
<!-- <p>双向绑定: <input type="text" :value="site" @input="site=$event.target.value"></p> -->
<!-- 因为这种双向绑定比较常用,vue提供了一个语法糖 -->
<!-- v-mode="site", ====> @input="site=$event.target.value" -->
<p>双向绑定: <input type="text" v-model.lazy="site"></p>
<p>双向绑定: <input type="text" v-model.number="num"></p>
<p>{{typeof num}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const vm = new Vue({
el: '.app',
data: {
site: 'php中文网',
num: "0",
}
})
// vm.site = 'php.cn'
</script>
v-for:简单来说就是遍历一个数组/对象,不过在 vue 中的 v-for 不是那么简单,它可以用来动态的生成列表。
v-for 的默认行为会尝试原地修改元素而不是移动它们。要强制其重新排序元素,你需要用特殊属性 key 来提供一个排序提示。key 只能是整数或是不重复的字符串,只有唯一,它才可以作为排序时的关键信息。
<div class="app">
<!-- key: 可以干预diff算法 -->
<!-- vue通过稳定且唯一的key值判断这个节点是否需要重新渲染, 以提升效率 -->
<!-- key只能是整数或不重复的字符串 -->
<ul>
<li v-for="(item,index) in items" :key="index">{{index}}--{{item}}</li>
</ul>
<ul>
<li v-for="(item,prop,index) in user" :key="prop">{{prop}}--{{index}}--{{item}}</li>
</ul>
<ul>
<li v-for=" (user, index) in users" :key="user.id">{{user.id}}--{{user.name}}--{{user.email}}</li>
</ul>
<span v-for="(n,i) in 10" :key="i">{{i}}--{{n}}<br></span>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
const vm = new Vue({
el: ".app",
data: {
// 数组
items: ["合肥", "苏州", "杭州"],
// 对象
user: {
name: "天蓬",
email: "tp@php.cn",
},
// 对象数组, 数据表的查询结果就是一个二个这样的二维的JSON
users: [
{ id: 1, name: "天蓬", email: "tp@php.cn" },
{ id: 2, name: "灭绝", email: "mj@php.cn" },
{ id: 3, name: "西门", email: "xm@php.cn" },
],
},
});
</script>