vue入门教程1
学习课件
https://www.bilibili.com/cheese/play/ep43199?csource=common_hp_favorite_null&spm_id_from=333.999.0.0
https://www.bilibili.com/video/BV1Th411G7iN?p=1&vd_source=7434cfee3c0d52d31452f06dad54119f
vue语法体验
NVM USE NODE_VERSION
nvm use 16.14.0 可以切换多个nvm版本
vue的基本结构
先写一个简单的hello,world来看下结构,当前主要分为三个部分组成
1.首先created是最先执行的,它是一个生命周期,也叫钩子函数,用于页面还没加载完毕时发送请求,初始化data里的值。
2.data一般用来存放vue中的变量,通过return将数据返回到created中
3.methods用来写相关模块的函数以及功能的实现,格式为async+方法名,通常通过发送请求请求到后台数据
4.computed是界于created和mounted之间发生的,此时正是页面进行渲染的时候
5.mounted是加载完dom操作后才会触发,它和created一样只会执行一次,此时页面已经渲染完成,通常用于存放需要渲染的内容
下面是一个电简单的自加计算器

按照传统的做法就是
document.getElementById('root').innerHTML(3) //这种是手动操作的一种方式
之前我们是面向Dom编程,现在是面向数据编程
总结:
数据定义: 通过data()来实现
template: 指的就是在root节点下需要渲染什么样的内容,具体是由mount中的参数来决定
mounted(): 表示页面加载完成后自动执行的命令
思考的一些问题:
我们知道一般vue使用ajax或者axios来获取后端数据,并且好像放在created里面和mounted里面都可以获取数据并正确渲染。那么放在created里面和mounted里面有什么区别呢?
参考:
javascript - Vue.nextTick 的原理和用途 - 个人文章 - SegmentFault 思否
简单来说:如果你修改了某个dom中的数据,视图并不会立即更新。Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。,此时获取关于此dom的一切操作都是无效的,怎么办?在nextTick的回调中执行即可。$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM。
js字符串反转的几种方式
- 第一种:
字符串转数组,反转数组,数组转字符串。
- split(“”):根据空字符串拆分数组
- reverse():数组反转元素位置
- join(“”):数组转回字符串,且不带分隔符
let str = "hello world";
let newStr = str.split("").reverse().join("");
console.log(newStr);
- 第二种:
使用遍历以及api charAt()
let str = "hello world";
let newStr = "";
for(let i=0;i<i.length;i++){
let s = str.charAt(str.length-i-1);
newStr += s;
}
console.log(newStr);
2.v-on编写字符串反转
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./js/vue.global.js"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
Vue.createApp({
data(){
return {
content: 'hello, world' //为什么这里定义的数据在通过console来打印不显示?
}
}
,
// mounted(){
// setInterval(() =>{
// console.log
// }, 1000)
// },
methods: {
handleBtnClick(){
let newStr = this.content.split("").reverse().join("")
//说明: split("")意思就是按照空字符串进行打散,然后反转然后再聚合为字符串不带分隔符
/*
split(“”):根据空字符串拆分数组
reverse():数组反转元素位置
join(“”):数组转回字符串,且不带分隔符
*/
console.log(newStr)
this.content = newStr
}
},
template: `
<div>
{{ content }}
<button v-on:click="handleBtnClick"> 反转 </button>
</div>
`
}).mount('#root')
</script>
</html>
v-on:click 用于绑定事件,相当于html中的on-click
3.show-内容展示或者隐藏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./js/vue.global.js"></script>
</head>
<body>
<div id="root"></div>
</body>
<script>
Vue.createApp({
data(){
return {
show: true
}
}
,
// mounted(){
// setInterval(() =>{
// console.log
// }, 1000)
// },
methods: {
handleBtnClick(){
/*
写法1
if (this.show == true) {
console.log(this.show)
this.show = false
} else {
console.log(this.show)
this.show = true
}
*/
//写法2
this.show = !this.show
}
},
template: `
<div>
<span v-if="show"> hello, world !</span>
<button v-on:click="handleBtnClick"> 展示/隐藏 </button>
</div>
`
}).mount('#root')
</script>
</html>
总结:
通过 true或者false来控制span标签是否展示
补充:
this.show = !this.show 用于true跟false之间的互换
vue基础语法
todolist和v-model双向绑定
<body>
<div id="root"></div>
</body>
<script>
Vue.createApp({
data(){
return {
//list: ['hello','world','dell','lee']
list: [],
inputValue: ''
}
}
,
methods: {
handleAddClick(){
this.list.push(this.inputValue) //把值进行赋值增加到list[]中即可
}
},
template: `
<div>
<input v-model="inputValue"/> <!--v-model中的inputValue跟data中的这个值做了双向绑定----->
<button v-on:click="handleAddClick">增加</button>
</div>
<div>
<ul>
<!---<li v-for="item of list"> {{item}}</li>--->
<li v-for="(item,index) of list"> {{item}} {{index}}</li>
</ul>
</div>
`
}).mount('#root')
</script>
todolist: 用于循环一个数组列表
可以使用
v-for="item of list"
或者
v-for="(item,index) of list"> 这种可以携带索引
v-model: 用于实现对template中的元素跟data中的数据进行绑定,输入框中输入的数据通过函数写入到data中的list表中
一个标签上的属性如果想要跟data中的数据进行绑定,需要用到的v-bind这个属性
v-bind属性

代码参考
<script>
Vue.createApp({
data(){
return {
//list: ['hello','world','dell','lee']
list: [],
inputValue: ''
}
}
,
methods: {
handleAddClick(){
this.list.push(this.inputValue) //把值进行赋值增加到list[]中即可
}
},
template: `
<div>
<input v-model="inputValue"/> <!--v-model中的inputValue跟data中的这个值做了双向绑定----->
<button v-on:click="handleAddClick" v-bind:title="inputValue">增加</button>
</div>
<div>
<ul>
<!---<li v-for="item of list"> {{item}}</li>--->
<li v-for="(item,index) of list"> {{item}} {{index}}</li>
</ul>
</div>
`
}).mount('#root')
组件的概念1
页面上的一部分都可以看作是一部分,页面的所有的文件写到一个文件中很难维护,所哟对列表项都可以拆分为组件
每一 个最小的组件就是一个Dom的一个标签
就像下面这个列表就可以拆分为一个组件出来

如何对下面的代码进行拆分呢
<body>
<div id="root"></div>
</body>
<script>
Vue.createApp({
data(){
return {
//list: ['hello','world','dell','lee']
list: [],
inputValue: ''
}
}
,
methods: {
handleAddClick(){
this.list.push(this.inputValue) //把值进行赋值增加到list[]中即可
}
},
template: `
<div>
<input v-model="inputValue"/> <!--v-model中的inputValue跟data中的这个值做了双向绑定----->
<button v-on:click="handleAddClick" v-bind:title="inputValue">增加</button>
</div>
<div>
<ul>
<!---<li v-for="item of list"> {{item}}</li>--->
<li v-for="(item,index) of list">
<div>
<span>{{index}} </span>
<span> --- </span>
<span> {{item}} </span>
</div>
</ul>
</div>
`
}).mount('#root')
</script>
把下面的部分需要单独去维护
<div>
<span>{{index}} </span>
<span> --- </span>
<span> {{item}} </span>
</div>
拆分后的参考
<body>
<div id="root"></div>
</body>
<script>
const App = Vue.createApp({
data(){
return {
//list: ['hello','world','dell','lee']
list: [],
inputValue: ''
}
}
,
methods: {
handleAddClick(){
this.list.push(this.inputValue) //把值进行赋值增加到list[]中即可
}
},
template: `
<div>
<input v-model="inputValue"/> <!--v-model中的inputValue跟data中的这个值做了双向绑定----->
<button v-on:click="handleAddClick" v-bind:title="inputValue">增加</button>
</div>
<div>
<ul>
<todo-item v-for="(item,index) of list" v-bind:content="item" v-bind:index="index">
</ul>
</div>
`
})
App.component('todo-item',{
props: ['content','index'], //在这里用于接收传递过来的两个值
// data() {
// return {
// item: 'hello qiang'
// }
// },
template: `<div>
<li>
{{ content }} -- {{ index }}
</li>
</div>`
})
App.mount('#root') //最后挂在实例
</script>
初始化一个vue实例出来
const App = Vue.createApp( xxx
App.component 用于注册组件到vue中
App.mount('#root') //最后挂在实例
组件的概念2
代码如下:
<body>
<div id="root"></div>
</body>
<script>
const App = Vue.createApp({
data(){
return {
message: 'hello, world'
}
}
,
template: '<div>{{message}}</div>'
})
const vm = App.mount('#root')
</script>
</html>
vm 的使用:
如何操作vue组件的数据属性,通过vm.$data 这种方式来访问,必须需要添加$

总结:
createApp表示创建一个Vue应用,存储到app变量中
传入参数的表示,这个应用最外层的组件,应该如何展示
mvvm模式,设计模式. m -> model数据(data), v-> view视图,vm-> viewMode视图数据连接层(vue的组件来操作)
vm代表的就是vue应用的根组件