博客列表 >0803-VUE术语、指令

0803-VUE术语、指令

三九三伏
三九三伏原创
2022年08月24日 10:29:28518浏览

实例演示课堂上提及的全部指令, 并详细写出常用的术语,以及使用场景

一、vue动态修改html内容

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://unpkg.com/vue@next"></script>
  9. <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  10. </head>
  11. <body>
  12. <h1>Hello world</h1>
  13. <!-- {{message}}:插值,数据占位符,供Vue使用。 -->
  14. <h1 class="title">{{message}}</h1>
  15. <script>
  16. // es6
  17. // document.querySelector('.title').textContent = "es6大家好";
  18. // jQuery
  19. // $('.title').text('jQuery 大家好');
  20. // VUE,es6和jQuery的修改会破坏message,因此要使用时注释掉上面内容。
  21. const app = Vue.createApp({
  22. data(){
  23. return {
  24. message:'Vue 大家好',
  25. };
  26. },
  27. });
  28. app.mount('.title');
  29. </script>
  30. </body>
  31. </html>

二、vue术语与实例

1. 挂载点

挂载点:vue实例的作用域

只能有一个挂载点,body不能作为为挂载点。

2. vue实例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://unpkg.com/vue@next"></script>
  9. <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  10. </head>
  11. <body>
  12. <div class="app">
  13. <p>{{username}}</p>
  14. </div>
  15. <script>
  16. // vue配置项
  17. const config = {
  18. data(){
  19. return {
  20. // 返回的数据
  21. username: 'vue hello',
  22. };
  23. },
  24. };
  25. // vue实例
  26. const app = Vue.createApp(config);
  27. // vue挂载
  28. app.mount('.app');
  29. </script>
  30. </body>
  31. </html>

3. 注入

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://unpkg.com/vue@next"></script>
  9. <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  10. </head>
  11. <body>
  12. ...
  13. <script>
  14. ...
  15. // 数据注入
  16. console.log(app.$data.username);
  17. // 可以简化如下,因为数据已经被注入到vue的实例中
  18. console.log(app.username);
  19. // 用访问器属性模拟数据注入
  20. const obj = {
  21. $data: {
  22. mail: 'mail@php.cn',
  23. },
  24. get email() {
  25. return this.$data.mail;
  26. },
  27. };
  28. console.log(obj.$data.mail);
  29. console.log(obj.email);
  30. </script>
  31. </body>
  32. </html>

4. 响应式

  1. <script>
  2. ...
  3. // 响应式
  4. app.username = "响应式修改结果";
  5. </script>

三、vue指令

本质上就是html便签的自定义属性

1.v-text

类似textContent属性

  1. <body>
  2. <div class="app">
  3. <p>用户名:<span v-text="username"></span></p>
  4. </div>
  5. <script>
  6. const app = Vue.createApp({
  7. data(){
  8. return {
  9. username: '路人甲',
  10. };
  11. },
  12. }).mount('.app');
  13. </script>
  14. </body>
  15. </html>

2. v-html

类似innerhtml属性
如果使用v-text,下面代码输出为html原样输出。

  1. <body>
  2. <div class="app">
  3. <p>用户名:<span v-text="username"></span></p>
  4. </div>
  5. <script>
  6. const app = Vue.createApp({
  7. data(){
  8. return {
  9. username: '路人甲',
  10. };
  11. },
  12. }).mount('.app');
  13. app.username = '<i style="color:red">路人乙</i>';
  14. </script>
  15. </body>


将v-text改为v-html,则可以按样式输出。

  1. <body>
  2. ...
  3. <p>用户名:<span v-html="username"></span></p>
  4. ...
  5. <script>
  6. ...
  7. app.username = '<i style="color:red">路人乙</i>';
  8. </script>
  9. </body>

3. v-bind

vue动态属性设置指令 v-bind:属性名

3.1 行内样式

  1. <body>
  2. <style>
  3. .active{
  4. color:red;
  5. }
  6. .bgc {
  7. background-color: yellow;
  8. }
  9. </style>
  10. <div class="app">
  11. <!-- <p style="color: green;">php.cn</p> -->
  12. <!-- vue动态属性设置指令 v-bind:属性名 -->
  13. <p v-bind:style="style">php.cn</p>
  14. </div>
  15. <script>
  16. const app = Vue.createApp({
  17. data(){
  18. return {
  19. style: "color:blue",
  20. };
  21. },
  22. }).mount('.app');
  23. </script>
  24. </body>

改变多个属性值时,

  1. <body>
  2. <style>
  3. ...
  4. ...
  5. <!-- vue动态属性设置指令 v-bind:属性名 -->
  6. <p v-bind:style="{color:txtcolor,backgroundColor:bgc}">php.cn</p>
  7. ...
  8. <script>
  9. const app = Vue.createApp({
  10. data(){
  11. return {
  12. txtcolor: 'blue',
  13. bgc: 'lightcoral',
  14. };
  15. },
  16. }).mount('.app');
  17. </script>
  18. </body>


以数组方式添加多个属性值

  1. ...
  2. <div class="app">
  3. <!-- <p style="color: lightcoral;">php.cn</p> -->
  4. <!-- vue动态属性设置指令 v-bind:属性名 -->
  5. <p v-bind:style="{color:txtcolor,backgroundColor:bgc}">php.cn</p>
  6. <p v-bind:style="[base,custom]">php.cn</p>
  7. </div>
  8. <script>
  9. const app = Vue.createApp({
  10. data(){
  11. return {
  12. txtcolor: 'blue',
  13. bgc: 'lightcoral',
  14. base: {
  15. border: '1px solid',
  16. background: 'lightgreen',
  17. },
  18. custom: {
  19. color: 'black',
  20. padding: '15px',
  21. },
  22. };
  23. },
  24. }).mount('.app');
  25. </script>

3.2 类样式

3.2.1 直接传字面量

  1. ...
  2. <style>
  3. .active{
  4. color:red;
  5. }
  6. .bgc {
  7. background-color: yellow;
  8. }
  9. </style>
  10. <div class="app">
  11. ...
  12. <!-- 直接传字符串 -->
  13. <p v-bind:class="'active'">路人甲</p>
  14. </div>
  15. <script>
  16. const app = Vue.createApp({
  17. ...
  18. };
  19. },
  20. }).mount('.app');
  21. </script>

3.2.2 传变量

  1. ...
  2. <style>
  3. .active{
  4. color:red;
  5. }
  6. .bgc {
  7. background-color: yellow;
  8. }
  9. </style>
  10. <div class="app">
  11. ...
  12. <!-- 传变量 -->
  13. <p v-bind:class="active">路人甲</p>
  14. </div>
  15. <script>
  16. const app = Vue.createApp({
  17. ...
  18. active: 'active',
  19. };
  20. },
  21. }).mount('.app');
  22. </script>

3.2.3 传对象字面量

  1. ...
  2. <style>
  3. .active{
  4. color:red;
  5. }
  6. .bgc {
  7. background-color: yellow;
  8. }
  9. </style>
  10. <div class="app">
  11. ...
  12. <!-- 传字面量 -->
  13. <p v-bind:class="{active: isActive}">路人甲</p>
  14. </div>
  15. <script>
  16. const app = Vue.createApp({
  17. ...
  18. active: 'active',
  19. isActive: true,
  20. };
  21. },
  22. }).mount('.app');
  23. </script>

3.2.4 多个属性设置,传入字面量

  1. <p v-bind:class="['active', 'bgc']">路人甲</p>

3.2.4 多个属性设置,传入变量

  1. <p v-bind:class="[mycolor, mybgc]">路人甲</p>
  2. const app = Vue.createApp({
  3. data(){
  4. ...
  5. mycolor: 'active',
  6. mybgc: 'bgc',
  7. ...
  8. }).mount('.app');

3.2.5 v-bind可以简写为冒号

v-bind是高频指令,可以简化为冒号 “:”

  1. <p :class="['active', 'bgc']">路人甲</p>

4 数据双向绑定

4.1 传统方法实现数据双向绑定

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://unpkg.com/vue@next"></script>
  9. <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  10. </head>
  11. <body>
  12. <p>
  13. <div>ES6:</div>
  14. <input type="text" oninput="this.nextElementSibling.textContent = this.value"><span></span>
  15. </p>
  16. <script>
  17. </script>
  18. </body>
  19. </html>

4.2 vue方式实现数据双向绑定

vue中event不能直接使用,要加$符号,见代码中16行。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="https://unpkg.com/vue@next"></script>
  9. <!-- <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> -->
  10. </head>
  11. <body>
  12. <!-- vue实现数据双向绑定 -->
  13. <div class="app">
  14. <p>
  15. <!-- v-on:vue的事件指令 -->
  16. <input type="text" v-on:input="comment = $event.target.value" :value="comment" />
  17. <span>{{comment}}</span>
  18. </p>
  19. </div>
  20. <script>
  21. const app = Vue.createApp({
  22. data(){
  23. return {
  24. comment: '',
  25. };
  26. },
  27. }).mount('.app');
  28. </script>
  29. </body>
  30. </html>
  31. ![](https://img.php.cn/upload/image/366/692/605/1661303448509867.png)

4.3 v-on可以简化为“@”符号

  1. <input type="text" @input="comment = $event.target.value" :value="comment" />

4.4 v-model

可以使用v-model简化v-on
原语句

  1. <input type="text" @input="comment = $event.target.value" :value="comment" />

v-model简化后

  1. <input type="text" v-model="comment" />

v-model.lazy延迟绑定

  1. <input type="text" v-model.lazy ="comment" />

效果不像之前输入一个内容回显一个内容,这样增加页面负担,延迟就是等全部输入完成,失去焦点后再回显。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议