下载vue开发版本 引入
<script src="/js/vue.js"></script>
F12可见提示,引入成功
关闭开发模式提示
Vue.config.productionTip = false;
<div id="root"></div>
<script>
new Vue({
el: '#root'
});
</script>
或
<div id="root"></div>
<script>
new Vue({}).$mount('#root');
</script>
用于解析标签体内容
{{JS表达式}}
<div id="root">
<h1>{{message}}</h1>
</div>
<script>
new Vue({
el: '#root',
data() {
return {
message: 'Hello world'
}
}
});
</script>
用于解析标签(属性,标签体内容,绑定事件…)
v-bind:attribute=“JS表达式”
<div id="root">
<a v-bind:href="url">baidu</a>
</div>
<script type="text/javascript">
Vue.config.productionTip = false;
new Vue({
el: '#root',
data() {
return {
url: 'https://www.baidu.com'
}
}
});
</script>
双向绑定v-model只能用于表单类元素(有value属性的元素)上
单向:<input type="text" v-bind:value="message" />
双向:<input type="text" v-model:value="message" />
简写
单向:<input type="text" :value="message" />
双向:<input type="text" v-model="message" />
<button v-on:click="onBtnClick($event,message)">click</button>
简写
<button @click="onBtnClick($event,message)">click</button>
new Vue({
data() {
message: 'hello world'
},
methods: {
onBtnClick(event, message) {
alert(message + ' clicked');
}
}
})
<a @click.prevent.stop="onClick">click</a>
<input @keydown.Enter="onKey"></input>
<input @keydown.caps-lock="onKey"></input>
<input @keydown.tab="onKey"></input>
<input @keydown.ctrl.x="onKey"></input>
<input v-model:value="fn"/>
<input v-model:value="ln"/>
<input v-model:value="fullname"/>
new Vue({
data() {
firstname: 'san',
lastname: 'zhang'
},
computed: {
fullname: {
// 1. 初次读取时调用,模板中多次使用,只调用一次(如果使用method定义计算,则会多次调用)
// 2. 所依赖的数据发生变化时调用
get(){
return this.firstname + '-' +this.lastname
},
// 可选,fullname变化时调用
set(value){
const arr = value.split('-');
this.firstname=arr[0];
this.lastname=arr[1];
}
}
}
})
computed:{
fullname: function{
return this.firstname + '-' +this.lastname
}
}
通过配置
watch: {
fullname: {
immediate: true, // 初始化时调用handler
handler(newv, oldv) {
console.log('change', newv, oldv);
}
}
}
通过api
let vm = new Vue({...});
vm.$watch('fullname',{
immediate: true,
handler(newv, oldv) {
console.log('change', newv, oldv);
}
});
简写 不需要其他配置时(immediate,deep)可使用简写
watch:{
fullname(newValue,oldValue){}
}
data() {
return {
name:{
fn: 'fn',
ln: 'ln'
}
}
},
watch: {
// 监视结构中属性
'name.fn':{},
// 监视结构中所有属性变化
name:{
deep:true,
handler(){};
}
}
当需要异步处理计算逻辑时得使用watch
watch:{
name:{
deep:true,
handler(){
setTimeout(()=>{
// 注意此处使用箭头函数,this=vue实例
// 如果使用function ,this=window
this.fullname = name.fn + name.ln;
},1000)
}
}
}
绑定字符串:名字不确定 绑定数组:样式个数和名字都不确定 绑定对象:个数和名字确定,但不确定用不用
<div class='basic' :class='vClass'></div>
<div class='basic' :class='vClasses'></div>
<div class='basic' :class='vClassObj'></div>
data:{
vClass: 'class1',
vClasses:['class1','class2','class3'],
vClassObj:{
class1: true,
class2: false
}
}
表达式绑定值 绑定对象 绑定数组
<div :style="{fontSize: styleObj.fontSize}">123</div>
<div :style="styleObj">123</div>
<div :style="styleObjs">123</div>
data() {
return {
styleObj: {
fontSize: '40px'
},
styleObjs:[{},{}]
}
}
v-show dom结构在,样式为不显示 v-if dom结构不创建,使用if,else指令的元素必须相邻 v-if可以配合template使用,包裹同时控制多个结构
<div v-show="!hidden"></div>
<div v-if="n==1"></div>
<div v-else-if="n==2"></div>
<div v-else></div>
可遍历:数组,对象属性,字符串,指定次数 注:尽量使用key,可以提高性能(更新根据KEY复用/替换已经创建的dom,否则将自动根据index作为Key)
<ul>
<li v-for="person in psersons" :key="id">{{person.name}}</li>
</ul>
<ul>
<li v-for="(person,index) in psersons" :key="id">{{index}}-{{person.name}}</li>
</ul>
<ul>
<li v-for="(attr,key) of car" :key="key">{{key}}:{{attr}}</li>
</ul>
<ul>
<li v-for=(number,index) of 5></li>
</ul>
data(){
persons:[{id:1,name:'a'},{id:2,name:'b'}],
car:{
name: 'name',
prices: 100,
model: 'model'
}
}
data(){
minAge: 10,
sort:0,
persons:[{id:1,name:'a',age:10},{id:2,name:'b',age:22}]
},
computed:{
filteredPersons(){
let arr = this.person.filter((p)=>{return p.age>this.minAge})
if(this.sort){
arr.sort((p1,p2)=>{return this.sort === 1 ? p1.age-p2.age : p2.age-p1.age})
}
}
},
watch:{
minAge:{
immediate: true, // 注意不写此配置,初始渲染会有问题
handler:function(value){
this.filteredPersons2 = this.person.filter((p)=>{return p.age>this.minAge});
}
}
}
let vm = new Vue({
data() {
myObj:{}
}
});
Vue.set(vm._data.myObj,'newProp1','value')
// 或
vm.$set(vm.myObj,'newProp2','value')
push() pop() shift() unshift() splice() sort() reverse()
替换数组元素
vm.$set(vm.myArr,index,'value')