Vue快速学习_第二节
表单输入绑定(v-model)
v-model 指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定(注意只在表单这几个可以,实际上就是负责监听用户的输入事件以更新数据)
注意:v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源.
v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:
text 和 textarea 元素使用
value属性和input事件;checkbox 和 radio 使用
checked属性和change事件;select 字段将
value作为 prop 并将change作为事件。
上面的解释来源于官网,感觉不错就拿过来了,好了,接着来实际操作下看看吧
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="box">
<!--下面是v-model使用实例,双向数据绑定-->
<!--1.input文本使用-->
<input type="text" v-model="msg" placeholder="请输入值">
<p>{{ msg }}</p>
<br>
<!--2.textarea富文本使用,这样一旦一个改变,界面上所有引用的地方都会改变,
在文本区域插值 (<textarea>{{text}}</textarea>) 并不会生效,应用 v-model 来代替。-->
<textarea v-model="msg" placeholder="富文本输入"></textarea>
<br>
<!--3.单个复选框使用,checked选中就是true,没选中就是false-->
<input type="checkbox" id="checked" v-model="checked">
<!--label的作用就是for关联对应的id标签,点击label文本就相当于点击了input-->
<label for="checked">{{ checked }}</label>
<br>
<!--4.多个复选框使用-->
<div>
<input type="checkbox" id="c1" value="apple" v-model="checked_list">
<label for="c1">apple</label>
<input type="checkbox" id="c2" value="banana" v-model="checked_list">
<label for="c2">banana</label>
<input type="checkbox" id="c3" value="peach" v-model="checked_list">
<label for="c3">peach</label>
<br>
<!--将选择的value值存入checked_list中-->
<span>多选的是: {{ checked_list }}</span>
</div>
<br>
<!--5.单选使用,同样是存储value值-->
<div>
<input type="radio" id="r1" value="apple" v-model="radio_one">
<label for="r1">apple</label>
<input type="radio" id="r2" value="banana" v-model="radio_one">
<label for="r2">banana</label>
<br>
<span>单选的是: {{ radio_one }}</span>
</div>
<br>
<!--6.选择框的使用-->
<div>
<!--v-model 表达式的初始值未能匹配任何选项,<select> 元素将被渲染为“未选中”状态,
所以建议用下面的方法,第一个为请选择但是设置disabled-->
<select v-model="selected">
<!--在v-model下select下的option要设置value=""才会默认第一个显示-->
<option disabled value="">请选择</option>
<option>A</option>
<!--有value就会将value值赋值给selected,没有则用文本的B-->
<option value="2">B</option>
<option value="3">C</option>
</select>
<span>你的选择是: {{ selected }}</span>
</div>
<br>
<!--7.多选绑定到一个数组-->
<div>
<!--data里面selecteds为一个空数组-->
<select multiple v-model="selecteds">
<option disabled value="">请选择</option>
<option>A</option>
<!--有value就会将value值赋值给selected,没有则用文本的B-->
<option value="2">B</option>
<option value="3">C</option>
</select>
<span>你的选择是: {{ selecteds }}</span>
</div>
<!--依旧是多选,但是是用v-for动态渲染-->
<div>
<!--select_for赋值了A,因此会默认选中value为A的选项-->
<select v-model="select_for">
<option v-for="(item, index) in option_list" :key="index" :value="item.value">{{ item.text }}</option>
</select>
</div>
<br>
<!--8.值的绑定,对于单选按钮,复选框及选择框的选项,v-model 绑定的值通常是静态字符串 (对于复选框也可以是布尔值),
但是有时我们可能想把值绑定到 Vue 实例的一个动态属性上,这时可以用 v-bind 实现,并且这个属性的值可以不是字符串-->
<input type="radio" v-model="toggle" v-bind:value="bind_value">
<!--value的值变成了动态属性bind_value-->
<span>{{toggle}}</span>
<br>
<!--9.修饰符 .lazy,在“change”时而非“input”时更新 ,也就是输入中不改变msg,回车或确定时改变-->
<input v-model.lazy="msg" >
<br>
<!--10.修饰符 .number,自动将用户的输入值转为数值类型-->
<input v-model.number="age" type="number">
<br>
<!--11.修饰符 .trim,自动过滤用户输入的首尾空白字符-->
<input v-model.trim="msg"> </div>
</body>
<script src="vue.js"></script>
<script>
// 多选列表数据
var options = [
{ text: 'One', value: 'A' },
{ text: 'Two', value: 'B' },
{ text: 'Three', value: 'C' }
];
new Vue({
el: '#box',
data(){
return {
msg: '',
checked: false,
checked_list: [],
radio_one: '',
selected: '',
selecteds: [],
option_list: [],
// 初始化给了A,这样select就会选中value为A的选项
select_for: 'A',
toggle: '',
bind_value: '值被绑定了',
age: '',
}
},
created(){
this.option_list = options
}
})
</script>
</html>
组件化开发
全局组件(通用组件可以考虑变成全局组件)
// 声明全局组件, 第一个参数是组件的名字(Vbtn), 第二个参数是options,声明完之后就可以在其他组件调用,不需要挂载
Vue.component('Vbtn', {
data(){
return {
msg: '按钮'
}
},
template:`<button>{{ msg }}</button>`
});局部组件
遵循三步骤: 声子(创建组件), 挂子(挂载到父组件), 用子(父组件使用子组件),下面代码使用包含全局组件的调用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="box">
<!--直接使用App组件-->
<App/>
</div> </body>
<script src="vue.js"></script>
<script>
/* 注意:如果仅仅是实例化Vue实例化对象中 既有el又有template,如果template中定义模板的内容,
那么template模板的优先级大于el,就会使用template的内容,没有的话就会使用el的内容 */ // 声明全局组件, 第一个参数是组件的名字(Vbtn), 第二个参数是options,声明完之后就可以在其他组件调用,不需要挂载
Vue.component('Vbtn', {
data(){
return {
msg: '按钮'
}
},
// 通过slot插槽分发内容(组件传递内容),就相当于别的组件调用传值会替换slot标签的位置
template:`<button>
<slot></slot>
</button>
`
}); // 定义App下的header区域,第一步声子,,然后App父组件就可以调用了
let Vheader = {
data(){
return {
header_login: '登录',
header_reg: '注册',
}
},
// 定义herader区域的模板内容,使用全局组件Vbtn,界面显示登录和注册按钮
template:`
<div>
<Vbtn>{{ header_login }}</Vbtn>
<Vbtn>{{ header_reg }}</Vbtn>
</div>
`
}; // 1.声子, Vue中 组件的名字首字母必须大写(与标签区分),组件中的data必须是一个函数且要有返回值,这里定义一个App
let App = {
data(){
return {
name: 'liu',
}
},
// 定义App组件内容,使用App组件的内容,注意template里面一定是有一个根标签包裹全部标签,使用Vheader
template:`
<div class="app1">
<h2>{{ name }}</h2>
<Vheader/>
<Vbtn>提交</Vbtn>
</div>
`,
components: {
// 挂载header组件
Vheader
}
}; new Vue({
el:'#box',
data(){
return { }
},
// 组件挂载
components:{
// 2.挂子,如果key和value(App:App)一样可以只写一个(App)
// App:App
App
}
}) </script>
</html>组件的嵌套(单向数据流)
父子组件传值
父往子传值(props)
在子组件中 使用props声明(注意要声明一个数组),可以直接在子组件中任意使用
// 子组件Vheader
let Vheader = {
data(){
return {
}
},
// 在子组件中 使用props声明(注意要声明一个数组),可以直接在子组件中任意使用
props:['t_name', 'title', 'post2'],
// 定义herader区域的模板内容,下面是使用父组件传过来的值
template:`
<div>
<span>{{ t_name }}</span>
<span>{{ title }}</span>
<span>{{ post2.title }}</span>
</div>
`
};父组件要定义自定义属性
// 父组件App
let App = {
data(){
// 父组件的数据
return {
name: 'liu',
post1: {
id: 1,
title: 'My Journey with Vue'
},
post2: {
id: 2,
title: 'test post'
}
}
},
// 传入一个对象的所有属性可以v-bind="post1"也可以:post2="post2",第一种相当于 v-bind:id="post1.id"和v-bind:title="post1.title",所以在子组件中直接接收id和title并使用.
template:`
<Vheader :t_name="name" v-bind="post1" :post2="post2"></Vheader>
`,
components: {
// 挂载header组件
Vheader
}
};
子往父传值(通过事件向父级组件传值,示例也包含了父向子传值)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="box">
<!--直接使用App组件-->
<App/>
</div> </body>
<script src="vue.js"></script>
<script>
// 全局组件Vbtn
Vue.component('Vbtn', {
data(){
return {
}
},
props:['id'],
template:`<button @click="clickHandler">
{{ id }}
</button>
`,
methods:{
// 1.点击触发clickHandler方法,接着$emit就去触发父组件的事件方法
clickHandler(){
// $emit是vue方法,第一个参数写父组件声明自定义的事件,第二个参数传值
this.$emit('headerClick', this.id)
}
}
}); // Vheader组件
let Vheader = {
data(){
return {
}
},
props:['post'],
// 2.父组件自定义事件,子组件点击按钮后通过$emit()触发父组件的headerClick中的headerHandler方法
template:`
<div>
<Vbtn :id="post.id" @headerClick="headerHandler"></Vbtn>
</div>
`,
methods: {
// 3.触发方法后,接着又去触发app父组件的appClick事件
headerHandler(val){
this.$emit('appClick', val)
}
}
}; // App父组件
let App = {
data(){
return {
name: 'liu',
post: {
id: 1,
title: 'My Journey with Vue'
},
}
},
// 4.header子组件通过$emit()触发父组件的appClick中的appHandler方法
template:`
<div class="app1">
<Vheader :t_name="name" :post="post" @appClick="appHandler"></Vheader>
</div>
`,
components: {
// 挂载header组件
Vheader
},
methods:{
// 5.该方法就是接收子组件的传值,并加1,重新赋值渲染界面
appHandler(val){
val++;
this.post.id = val;
}
}
}; new Vue({
el:'#box',
data(){
return {
}
},
// 组件挂载
components:{
App
}
}) </script>
</html>
平行组件传值
注意:A->B传值,那么B要声明事件,通过$on('事件的名称', function(){}), A则要触发事件 $emit('B组件中声明的事件名', '值val'),还有记住,前提条件是这两个方法必须绑定在同一个实例化对象中(比如let bus = new Vue()),同时绑定到bus上
let bus = new Vue();
// 全局组件Test, Test向Vheader传值msg, 因此$emit('Vheader组件中声明的事件名', '值val')
Vue.component('Test', {
data(){
return {
msg: '我是全局子组件的数据',
}
},
template:`<button @click="clickHandler">
按钮
</button>
`,
methods:{
clickHandler(){
// $emit和$on的事件要一样
bus.$emit('testData', this.msg)
}
}
}); // Vheader组件
let Vheader = {
data(){
return {
// 定义一个text接收msg
text: ''
}
},
template:`
<div>
<Test />
{{ text }}
</div>
`,
methods: {
},
// 接收$emit()传过来的值
created(){
// 这里的是bus调用,this指的是bus,所以要指向Vheader就需要用箭头函数指向父级
bus.$on('testData', (val) => {
this.text = val;
})
}
};
Vue快速学习_第二节的更多相关文章
- Vue快速学习_第一节
之前写CRM都是Django前后端一起写的,在大部分项目中实际上前后端是分离的,因此我们需要学习一个前端框架来进行前端页面的编写,这里选择了Vue进行学习,好了开始学习吧. 1.ES6部分知识点学习 ...
- Vue快速学习_第五节
axios安装及使用 网站文档地址:https://www.kancloud.cn/yunye/axios/234845 1.npm安装 cnpm install axios 2.// 在main.j ...
- Vue快速学习_第四节
获取原生的DOM方式($.refs) 给标签或者组件 添加ref <div ref = 'liu'>test</div> <Home ref = 'home'>&l ...
- Vue快速学习_第三节
过滤器 局部过滤器(组件内部使用的过滤器,跟django的很像, filters: {过滤器的名字: {function(val, a,b){}}} 全局过滤器(全局过滤器,只要过滤器一创建,在任何组 ...
- android内部培训视频_第二节 布局基础
第二节:布局入门 一.线性布局 需要掌握的属性: 1.orientation:排列方式 vertical:垂直 Horizontal:水平 2.weight:水平布局的权重 3.gravity:子控件 ...
- [ExtJS5学习笔记]第二节 Sencha Cmd 学习笔记 使你的sencha cmd跑起来
本文地址: http://blog.csdn.net/sushengmiyan/article/details/38313537 本文作者:sushengmiyan ----------------- ...
- VUE的学习_从入门到放弃(一)
一.vue的功能及作用 工作方式如下 1.不用操作DOM 2.单页面应用web项目 简称:SPA 3.当下各种新框架都采用的类似Vue或者类似React的语法去作为主语法,微信小程序/MpVue... ...
- 【PHP快速入门】 第二节 php基本语法
1.什么地方能写PHP代码? php代码需要写在php标识符内,就是这个东西: 在我们编写一个php程序时,必须要在这个文件里面写上 2.PHP语句要不要加分号? 有的地方要加,有的地方不要加.(似乎 ...
- Linux 基础学习(第二节)
free命令用于显示当前系统中内存的使用量信息,格式为:“free [-h]”. 为了保证Linux系统不会突然卡住宕机,因此内存使用量应该是运维人员时刻要关注的数据啦,咱们可以使用-h参数来以更人性 ...
随机推荐
- teamcity build web project arguments
/p:Configuration=%system.Configuration% => Release /p:DeployOnBuild=%system.DeployOnBuild% => ...
- 【Gerrit】Performance Cheat Sheet
首先说下做这件事情的主因,组内有人说Project repo sync有点慢,废话不多说,直接上图. 相关官方文档参考链接: 我的数据: ~/review_site/logs# fgrep " ...
- Visual Studio查找中文的正则表达式
原文: Visual Studio查找中文的正则表达式 经常有这样的需求:项目代码中有一些输出信息是中文写的,不过现在要做国际化,代码""中写的中文都要改成英文.这样就需要将代码中 ...
- 微信小程序把玩(四十)animation API
原文:微信小程序把玩(四十)animation API 动画水还是比较深的,这里只是简单介绍下小程序中动画的一些属性和注意事项,做动画前一定要整理好思路将动画一步步分解,再进行组合!这里只做引入. w ...
- MySQL数据库MHA+keepalive实现
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀 ...
- storm(一)
Storm 一个用来实时计算的流框架,具有高可用,低延迟,数据不丢失,分布式的特点 storm 处理数据的方式是基于消息的流水线处理,因此特别适合无状态的计算,也就是说计算单元依赖的数据全部在接受的消 ...
- WebRequest请求错误(服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF)
WebRequest请求错误(服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF)解决办法,天津config文件,增加一个配置如下 <?x ...
- python中的函数名,闭包,迭代器
一.函数名 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址. def func(): print('你说你有点难追') print(func ...
- Yolov3代码分析与训练自己数据集
现在要针对我们需求引入检测模型,只检测人物,然后是图像能侧立,这样人物在里面占比更多,也更清晰,也不需要检测人占比小的情况,如下是针对这个需求,用的yolov3-tiny模型训练后的效果. Yolov ...
- Spring Boot:快速入门教程
什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...