当前位置:   article > 正文

学习Vue,Vue基础语法02_在vue中,对于

在vue中,对于

目录

  • 1.样式绑定
  • 2. 事件修饰符
  • 3. 按键修饰符
  • 4. 常用控件
    • 4.1 常用控件示例
    • 4.2 修饰符
  • 5. 自定义指令
    • 5.1 局部
    • 5.2 全局
  • 6. vue组件(重点)
    • 6.1 组件介绍
    • 6.2 局部组件
    • 6.3 全局组件
  • 7. 自定义事件
    • 7.1 子 -> 父
    • 7.2 父 -> 子

 

1.样式绑定

  • class绑定
    使用方式:v-bind:,expression的类型:字符串、数组、对象
  • style绑定
    v-bind:style="expression", expression的类型:字符串、数组、对象

示例:

  1. <--定义示例样式-->
  2. <style>
  3. .fontClass {
  4. font-size: 40px;
  5. }
  6. .colorClass {
  7. color: red;
  8. }
  9. </style>
  10. <!--使用-->
  11. <p>
  12. <span v-bind:class="fc">fafa</span>
  13. </p>
  14. <p>
  15. <!--简写-->
  16. <span :class="ac">fafa</span>
  17. </p>
  18. <p>
  19. <!--直接使用style样式单-->
  20. <span style="font-size: 40px; color:blue;">aaa</span>
  21. <br/>
  22. <!-- 使用vue,样式名称为驼峰风格 。花括号,多个属性逗号分隔-->
  23. <span :style="{fontSize:fontSize+'px',color: color}">bbb</span>
  24. <br/>
  25. <span :style="myStyle">test</span>
  26. </p>
  1. var vm = new Vue({
  2. el: "#app",
  3. data: {
  4. fc: 'fontClass',
  5. ac: ['fontClass', 'colorClass'],
  6. fontSize: 40,
  7. color: 'green',
  8. //样式对象,注意:样式名使用驼峰命名,如:fontSize
  9. myStyle: {
  10. fontSize: '50px',
  11. color:'red',
  12. fontWeight: 'bold'
  13. }
  14. }
  15. });

2. 事件修饰符

几个常用的事件修饰符:

  • <!-- 提交事件不再重载页面 -->
    <form v-on:submit.prevent="onSubmit"></form>
  • <!-- click 事件只能点击一次 -->
    <a v-on:click.once="doThis"></a>
  • <!-- 阻止单击事件冒泡 -->
    <a v-on:click.stop="doThis"></a>
  • <!-- 修饰符可以串联 -->
    <a v-on:click.stop.prevent="doThat"></a>
  • <!-- 添加事件侦听器时使用事件捕获模式 -->
    <div v-on:click.capture="doThis">...</div>

示例:

  1. <div>接收消息:{{receverMsg}}</div>
  2. <p>
  3. <!--响应多次或一次点击事件-->
  4. <input type="text" v-model="sendMsg">
  5. <button @click="sender">发送(多次)</button>
  6. <button @click.once="sender">发送(一次)</button>
  7. </p>
  8. <p>
  9. <!-- 阻止表单提交 -->
  10. <form action="testAction.action" method="post" @submit.prevent="doSubmit()">
  11. <label>名称</label>
  12. <input type="text" name="name"/>
  13. <input type="submit" value="提交"/>
  14. </form>
  15. </p>
  1. var vm = new Vue({
  2. el: "#app",
  3. data: {
  4. receverMsg: null,
  5. sendMsg: null
  6. },
  7. methods: {
  8. sender: function() {
  9. this.receverMsg = this.sendMsg;
  10. },
  11. doSubmit: function() {
  12. alert('ok');
  13. }
  14. }
  15. });

3. 按键修饰符

Vue允许为v-on在监听键盘事件时添加按键修饰符。
示例:

  1. <!-- 只有在 keyCode 是 13 时调用 vm.submit() -->
  2. <input v-on:keyup.13="submit">
  3. <!-- 利用下面的写法有同样的效果 -->
  4. <input v-on:keyup.enter="submit">
按键别名含义
.enter回车确认键
.tabTAB键
.delete捕获 "删除" 和 "退格" 键
.esc键盘左上角的Esc键,取消键
.space空格键
.up
.down
.left
.right
.ctrlctrl键
.shiftshift键

示例:响应enter键事件

<input type="text" @keyup.13="doSubmit" v-model="name">
  1. var vm = new Vue({
  2. el: "#app",
  3. data: function() {
  4. return {
  5. name: 'hello vue'
  6. }
  7. },
  8. methods: {
  9. doSubmit: function() {
  10. alert("响应enter," + this.name);
  11. }
  12. }
  13. });

4. 常用控件

4.1 常用控件示例

通过实现一个类型注册的页面,熟悉常用的控件。文本框/密码框/文本域/单选/多选/下拉列表

  1. <div id="app">
  2. <div>
  3. <label>账号:</label>
  4. <input type="text" v-model="uname">
  5. </div>
  6. <div>
  7. <label>密码:</label>
  8. <input type="password" v-model="upwd">
  9. </div>
  10. <div>
  11. <label>年龄:</label>
  12. <input type="text" v-model="age" >
  13. </div>
  14. <div>
  15. <label>性别:</label>
  16. <input type="radio" v-model="sex" value="1">
  17. <input type="radio" v-model="sex" value="2">
  18. </div>
  19. <div>
  20. <label>爱好:</label>
  21. <div style="display: inline;" v-for="h in hobbies">
  22. <input type="checkbox" :value="h.id" v-model="hobby"/>{{h.name}}
  23. </div>
  24. </div>
  25. <div>
  26. <label>地区</label>
  27. <select v-model="selectedCity">
  28. <option value="">-- 请选择 --</option>
  29. <option v-for="c in city" :value="c.id">{{c.name}}</option>
  30. </select>
  31. </div>
  32. <div>
  33. <label>备注:</label>
  34. <textarea v-model="remark"></textarea>
  35. </div>
  36. <div>
  37. <input type="checkbox" v-model="flag">是否已阅读并同意协议
  38. </div>
  39. <div>
  40. <button @click="submit" :disabled="disabled">提交</button>
  41. </div>
  42. </div>
  1. var vm = new Vue({
  2. el: "#app",
  3. data: {
  4. uname: '',
  5. upwd:'',
  6. age:'',
  7. sex: 1,
  8. //用于通过v-for指令输出多选框列表
  9. hobbies:[
  10. {id: '1', name:'打游戏'},
  11. {id: '2', name:'编程'},
  12. {id: '3', name:'旅游'}
  13. ],
  14. /*
  15. * 用于通过v-model双向绑定,保存用户的选择。
  16. * 此处为多选,需要通过数组接收,否则无法
  17. * 正常接收复选框的值,且复选框的行为也不正常,
  18. * 可能出现要么全部被选择,要么全部被取消的情况
  19. */
  20. hobby:[],
  21. remark: null,
  22. //用于生成地区选择列表
  23. city:[
  24. {id:"1", name:"长沙"},
  25. {id:"1", name:"株洲"},
  26. {id:"1", name:"湘潭"}
  27. ],
  28. //用于保存用户选择的地区
  29. selectedCity: '',
  30. //是否同意协议,默认值为false
  31. agreed:false,
  32. //提交按钮是否禁用,默认为true
  33. disabled: true
  34. },
  35. //监控agreed属性,如果同意协议则将提交按钮
  36. //设置为可用,否则提交按钮为禁用状态
  37. watch: {
  38. agreed: function(val) {
  39. if(val) {
  40. this.disabled = false;
  41. }else{
  42. this.disabled = true;
  43. }
  44. }
  45. },
  46. methods: {
  47. submit: function() {
  48. let data = {
  49. uname: this.uname,
  50. upwd: this.upwd,
  51. age:this.age,
  52. sex: this.sex,
  53. hobby: this.hobby,
  54. city: this.selectedCity,
  55. remark: this.remark
  56. }
  57. console.log(data);
  58. }
  59. }
  60. });

不使用监视器的简单方式: 删除监听器,然后将提交按钮的做如下修改

<button @click="submit" :disabled="!agreed">提交</button>

4.2 修饰符

修饰符作用
.lazy默认情况下, v-model在input事件中同步输入框的值与数据,但你可以添加一个修饰符lazy,从而转变为在change事件中同步
.number将用户的输入值转为 Number 类型
.trim自动过滤用户输入的首尾空格

以.number为例,示例修饰符的使用,将输入的年龄属性转换为数值型

  1. <div>
  2. <label>年龄:</label>
  3. <input type="text" v-model.number="age" >
  4. </div>

5. 自定义指令

Vue除支持内置的v-model/v-show等指令,还允许自定义指令。 vue2中,代码的复用和抽象的主要形式是组件,但在有些情况下仍然需要对普通dom元素做底层操作,这种情况下需要自定义指令。根据自定义指令的作用范围,可分为:全局、局部两种

钩子函数:

名称作用
bind只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
inserted被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
update所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)
componentUpdated指令所在组件的 VNode 及其子 VNode 全部更新后调用
unbind只调用一次,指令与元素解绑时调用

指令钩子函数会被传入以下参数:

  • el:指令所绑定的元素,可以用来直接操作 DOM 。
  • binding:一个对象,包含以下属性:
    1) name:指令名,不包括 v- 前缀。
    2) value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
    3) oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    4) expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
    5) arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
    6) modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
  • vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

5.1 局部

通过自定义标签设置文字颜色

  1. <div id="app">
  2. <!--red绑定到data里面的变量-->
  3. <p v-color="red">我是自定义指令</p>
  4. </div>
  1. var vm = new Vue({
  2. el: '#app',
  3. data: {
  4. red:'red'
  5. },
  6. //自定义指令,局部
  7. directives:{
  8. color: {
  9. inserted: function(el,binding) {
  10. console.log(el,binding);
  11. el.style.color = binding.value;
  12. }
  13. }
  14. }
  15. });

5.2 全局

  1. <div id="app">
  2. <!--red绑定到data里面的变量-->
  3. <p v-color="red">我是自定义指令</p>
  4. </div>
  1. //自定义标签,全局
  2. Vue.directive('color', {
  3. inserted: function(el,binding) {
  4. console.log(el,binding);
  5. el.style.color = binding.value;
  6. }
  7. })
  8. var vm = new Vue({
  9. el: '#app',
  10. data: {
  11. red:'red'
  12. }
  13. });

6. vue组件(重点)

6.1 组件介绍

  • 组件(Component)是Vue最强大的功能之一,
  • 组件可以扩展HTML元素,封装可重用的代码
  • 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树
  • 组件可以分为全局组件和局部组件

组件命名规则

  • 短横线命名,如: my-component,vue推荐使用这种方式的命名规则
  • 首字母大写命名规则,如:MyComponent

props

  • props是父组件用来传递数据的一个自定义属性。
  • 父组件的数据需要通过props把数据传给子组件,子组件需要显式地用props选项声明 "prop"

6.2 局部组件

定义语法:new Vue({el:'#d1',components:{组件名:{配置选项}}})

  1. <div id="app">
  2. <div>
  3. <!--title是用来传值的自定义属性,在自定义组件的props中定义 -->
  4. <button-counter title="测试"/>
  5. </div>
  6. </div>
  1. var vm = new Vue({
  2. el: '#app',
  3. data: {
  4. ts: new Date().getTime()
  5. },
  6. //局部自定义组件
  7. components: {
  8. //组件名: {配置项}
  9. 'button-counter': {
  10. //用来传值的自定义属性
  11. props:['title'],
  12. //模板,模板中写的html代码,在其中可以使用{{}},及指令等vue元素
  13. template: '<button @click="doClick">{{title}}:局部组件,点击计数器:{{count}}</button>',
  14. //注意:在自定义的组件中需要使用函数来定义data
  15. data: function() {
  16. return {
  17. count: 0
  18. }
  19. },
  20. //定义响应事件函数
  21. methods: {
  22. doClick: function() {
  23. //注意此处this的作用返回是自定义组件,而不是上面声明
  24. //的vue实例.
  25. this.count++;
  26. }
  27. }
  28. }
  29. }
  30. });

注:为什么在自定义组件中必须使用函数方式来什么data?
每个自定义组件使用函数方式来声明data,这样每个实例可以维护一份被返回对象的独立的拷贝,在定义自定义组件时,一定要注意这一点。

6.3 全局组件

将上面的局部组件修改为全局组件。
全局组件定义语法:Vue.component(组件名, 配置选项)

  1. <div id="app">
  2. <div>
  3. <button-counter title="测试"/>
  4. </div>
  5. </div>
  1. //全局组件
  2. Vue.component('button-counter', {
  3. //用来传值的自定义属性
  4. props:['title'],
  5. //模板,模板中写的html代码,在其中可以使用{{}},及指令等vue元素
  6. template: '<button @click="doClick">{{title}}: 全局组件,点击计数器:{{count}}</button>',
  7. //注意:在自定义的组件中需要使用函数来定义data
  8. data: function() {
  9. return {
  10. count: 0
  11. }
  12. },
  13. //定义响应事件函数
  14. methods: {
  15. doClick: function() {
  16. //注意此处this的作用返回是自定义组件,而不是上面声明
  17. //的vue实例.
  18. this.count++;
  19. }
  20. }
  21. });
  22. var vm = new Vue({
  23. el: '#app',
  24. data: {
  25. ts: new Date().getTime()
  26. }
  27. });

7. 自定义事件

Vue自定义事件是为组件间通信设计, vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定

  • 父Vue实例->子Vue实例,通过prop传递数据
  • 子Vue实例->父Vue实例,通过事件传递数据

7.1 子 -> 父

触发事件:$emit(eventName, 参数...)
注意:事件名必须用短横线命名方式。

  1. <div id="app">
  2. <!--子组件到父组件-->
  3. <div>
  4. <button-counter v-on:click-test="clickTest"/>
  5. </div>
  6. </div>
  1. var vm = new Vue({
  2. el: '#app',
  3. data: {
  4. ts: new Date().getTime()
  5. },
  6. //对于自定义的button-counter组件, Vue实例为父组件
  7. //在父组件中定义一个test方法,子组件调用该方法
  8. methods: {
  9. clickTest: function(msg) {
  10. console.log("test: "+ msg);
  11. }
  12. },
  13. //局部自定义组件
  14. components: {
  15. //组件名: {配置项}
  16. 'button-counter': {
  17. //用来传值的自定义属性
  18. props:['title'],
  19. //模板,模板中写的html代码,在其中可以使用{{}},及指令等vue元素
  20. template: '<button @click="doClick">{{title}}:局部组件,计数:{{count}}</button>',
  21. //注意:在自定义的组件中需要使用函数来定义data
  22. data: function() {
  23. return {
  24. count: 0
  25. }
  26. },
  27. //定义响应事件函数
  28. methods: {
  29. doClick: function() {
  30. //注意此处this的作用返回是自定义组件,而不是上面声明的vue实例.
  31. //注意事件名使用短横线命名方式
  32. this.$emit("click-test","hello vue");
  33. }
  34. }
  35. }
  36. }
  37. });

7.2 父 -> 子

注意:props定义属性时采用的是驼峰命名法,而在html中使用时需要对应的变为短横线命名法!!

  1. <div id="app">
  2. <!--子组件到父组件-->
  3. <div>
  4. <!-- 注意此处将定义props时的驼峰命名法,变为了短横线命名法 !!! -->
  5. <button-counter title-desc="测试" />
  6. </div>
  7. </div>
  1. var vm = new Vue({
  2. el: '#app',
  3. data: {
  4. ts: new Date().getTime()
  5. },
  6. //对于自定义的button-counter组件, Vue实例为父组件
  7. //在父组件中定义一个test方法,子组件调用该方法
  8. methods: {
  9. clickTest: function(msg) {
  10. console.log("test: "+ msg);
  11. }
  12. },
  13. //局部自定义组件
  14. components: {
  15. //组件名: {配置项}
  16. 'button-counter': {
  17. //用来传值的自定义属性
  18. //注意此处使用驼峰命名法 !!!
  19. props:['titleDesc'],
  20. //模板,模板中写的html代码,在其中可以使用{{}},及指令等vue元素
  21. template: '<button @click="doClick">{{titleDesc}}:局部组件,计数:{{count}}</button>',
  22. //注意:在自定义的组件中需要使用函数来定义data
  23. data: function() {
  24. return {
  25. count: 0
  26. }
  27. },
  28. //定义响应事件函数
  29. methods: {
  30. doClick: function() {
  31. //注意此处this的作用返回是自定义组件,而不是上面声明的vue实例.
  32. //注意事件名使用短横线命名方式
  33. this.count ++;
  34. console.log(this.titleDesc);
  35. }
  36. }
  37. }
  38. }
  39. });
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/228727
推荐阅读
相关标签
  

闽ICP备14008679号