Vue.js是一个MV VM框架, 即数据双向绑定, 即当数据发生变化的时候, 视图也就发生变化, 当视图发生变化的时候,数据也会跟着同步变化。这也算是Vue.js的精髓之处了。
值得注意的是,我们所说的数据双向绑定,一定是对于UI控件来说的非UI控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具的前提。如果我们使用Vuex那么数据流也是单项的,这时就会和双向数据绑定有冲突。
用户在视图上的修改会自动同步到数据模型中去,同样的,如果数据模型中的值发生了变化,也会立刻同步到视图中去。
双向数据绑定的优点是无需进行和单向数据绑定的那些CRUD操作。
双向数据绑定最经常的应用场景就是表单了,这样当用户在前端页面完成输入后,不用任何操作,我们就已经拿到了用户的数据存放到数据模型中了。
v-model
表单输入绑定
我们可以使用 v-model
指令在表单 、
及
元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。
下面来看代码:
单行文本:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div class="app">
<input type="text" v-model="message" value="hello">
<p>Message is {{message}}p>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
<script type="text/javascript">
var vm = new Vue({
el:".app",
data:{
message:""
}
});
console.log(vm._data);
script>
body>
html>
多行文本:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
<textarea v-model="pan">textarea> <br> 多行文本是:{{pan}}
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
"pan":"Hello hello!",
}
});
script>
body>
html>
单复选框:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
单复选框:
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{checked}}label>
div>
<script src="../js/vue.js">script>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
checked:false
}
});
script>
body>
html>
多复选框:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
单复选框:
<input type="checkbox" v-model="checked"> <br>
<label>{{checked}}label>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
checked:false
}
});
script>
body>
html>
单选按钮:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
单选框按钮: <br>
<label for="one">Onelabel>
<input type="radio" name="number" value="One" v-model="picked"> <br>
<label for="two">Twolabel>
<input type="radio" name="number" value="Two" v-model="picked"> <br>
<span>选中的值:{{picked}}span>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
picked:"One"
}
});
script>
body>
html>
下拉框:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
下拉框:
<select v-model="pan" style="margin-right: 20px;">
<option value="" disabled>---请选择---option>
<option>Aoption>
<option>Boption>
<option>Coption>
<option>Doption>
select>
<span>value:{{pan}}span>
div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
pan:"A"
}
});
script>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
下拉框:
<select v-model="pan">
<option value="" disabled>---请选择---option>
<option>Aoption>
<option>Boption>
<option>Coption>
<option>Doption>
select>
<span>value:{{pan}}span>
div>
<script src="../js/vue.js">script>
<script type="text/javascript">
var vm = new Vue({
el:"#app",
data:{
pan:"A"
}
});
script>
body>
html>
注意:
v-model
表达式的初始值未能匹配任何选项,下拉框将被渲染为“未选中”状态。 在iOS中, 这会使用户无法选择第一个选项,因为这样的情况下,iOS不会触发change
事件。因此,更推荐像上面这样提供一个值为空的禁用选项。
组件基础
组件是可复用的Vue
实例, 说白了就是一组可以重复使用的模板, 跟JSTL
的自定义标签、Thymeleal
的th:fragment
等框架有着异曲同工之妙,通常一个应用会以一棵嵌套的组件树的形式来组织:
例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。
注意:在实际开发中,我们并不会用以下方式开发组件,而是采用vue-cli
创建,vue
模板文件的方式开发,以下方法只是为了让大家理解什么是组件。
使用Vue.component()
方法注册组件,格式如下:
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Componenttitle>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
head>
<body>
<div class="app">
<comp>comp>
<comp>comp>
div>
body>
<script>
Vue.component("comp", {
template: ''
});
var vm = new Vue({
el: ".app",
});
script>
html>
说明:
Vue.component()
:注册组件comp
:自定义组件的名字template
:组件的模板像上面那样用组件没有任何意义,所以我们是需要传递参数到组件的,此时就需要使用props
属性了!
注意:默认规则下props属性里的值不能为大写;
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>propostitle>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js">script>
head>
<body>
<div class="app">
<comp v-for="item in arr" :elems="item">comp>
div>
body>
<script>
Vue.component("comp", {
props:['elems'],
template: "{{elems}} ",
});
var vm = new Vue({
el:".app",
data: {
arr: ["姓名", "年龄", "邮箱"],
},
});
script>
html>
VUE笔记一 基础语法指令
VUE笔记二 表单双绑、组件
VUE笔记三 Axios异步通信
VUE笔记四 计算属性、内容分发、自定义事件
VUE笔记五 vue-cli
VUE笔记六 webpack
VUE笔记七 vue-router
VUE笔记八 实战快速上手
参考资料:
https://www.bilibili.com/video/BV18E411a7mC?from=search&seid=11393012814896649855&spm_id_from=333.337.0.0
https://blog.csdn.net/qq_46138160/article/details/111028492