2.Vue — 模板语法、数据绑定、el与data的写法、数据代理

news/2024/7/10 0:03:04 标签: 前端, vue.js, vue

文章目录

  • 一、模板语法
    • 1.1 插值语法
    • 1.2指令语法
  • 二、数据绑定语法
    • 2.1 单向数据绑定
    • 2.2 双向数据绑定
  • 三、el与data的两种写法
    • 3.1 el
    • 3.2 data
  • 四、数据代理
    • 4.1 Object.defineProperty
    • 4.2 Vue数据代理
      • 4.2.1 展示数据代理
      • 4.2.2 Vue数据代理

一、模板语法

root容器里面的代码被称为【vue模板】

Vue模板语法有两大类:插值语法、指令语法

插值语法一般动态指定标签体内容,解析标签体内容

指令语法一般动态指定标签属性值,解析标签

1.1 插值语法

插值语法

功能:用于解析标签体的内容

语法: {{xxx}}**,**xxx是js表达式,且可以直接读取到data中的所有属性

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title> 初识vue</title>
        <!--引入vue    引入之后,全局就多了一个vue这个构造函数-->
        <script type="text/javascript" src="../js/vue.js>vue.js"></script> 
    </head>
    <body>
 
        <div id="root">
           <h1>插值语法</h1>
           <h3>你好,{{name}} </h3>
           <hr/>
        </div>
 
 
        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false 
 
            new  Vue({
              el:'#root',
              data:{
                name:'jack'
              }
 
            })
        </script>   

    </body>
</html>

1.2指令语法

假如我们使用下图的方式获取data中url的内容,控制台会有一个报错

vue"><a  :href="url">点我去一个好地方</a>
            new  Vue({
              el:'#root',
              data:{
                name:'jack',
                url:'http://www.baidu.com'
              }

报错信息:插值语法去动态指定标签里面的属性值的方式已经被移除了,我们可以使用v-bind或 :id=“val”,也就是指令语法

image-20231027213522883



指令语法

功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)

举例

v-bind:href=“xxx” 可简写成 :href=“xxx”

xxx同样要写js表达式,且可以直接读取到data中的所有属性

备注:Vue中有很多的指令,且形式都是:v-???

        <div id="root">
           <h1>插值语法</h1>
           <h3>你好,{{name}} </h3>
           <hr/>
           <h1>指令语法</h1>
           <!-- 带有v-的都是指令语法  bind是绑定的意思 -->
           <!-- 在这个地方把url的结构绑定给href   url为js表达式 -->
           <!-- v-bind可以动态的给属性绑定值 -->
           <!-- <a v-bind:href="url">点我去一个好地方</a> -->
           <!-- 其中v-bind都可以省略写成 :  -->
           <a  :href="url">点我去一个好地方</a>
        </div>
        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false 
 
            new  Vue({
              el:'#root',
              data:{
                name:'jack',
                url:'http://www.baidu.com'
              }
 
            })
        </script>   

原因:下面的url被当做url表达式来执行了

<a v-bind:href="url">

二、数据绑定语法

Vue中有两种数据绑定方式

1.单向绑定(v-bind):数据只能从data流向页面

2.双向绑定(v-model):数据能从data和页面互相流向

备注

1.双向绑定一般都应用在表单类元素上(如:input、select等)

2.v-model:value 可以简写为v-model,因为v-model默认手机的就是value值

2.1 单向数据绑定

我们之前在指令语法中见到了

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title> 初识vue</title>
        <!--引入vue    引入之后,全局就多了一个vue这个构造函数-->
        <script type="text/javascript" src="../js/vue.js>vue.js"></script> 
    </head>
    <body>
 
        <div id="root">
            单行数据绑定: <input type="text"  :value="name">
        </div>
 
 
        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false 
 
            new  Vue({
              el:'#root',
              data:{
                name:'尚硅谷123'
              }
            })
        </script>   
 
 
    </body>
</htm

展示单向数据绑定

image-20231027215746640

当我们在Vue中修改name的值的时候,页面的值也会随着修改,如下图

image-20231027215815606

但是我们在文本框中修改内容的时候,Vue中的name值不会改变

image-20231027215839512

原因: 单向绑定的关系

image-20231027215856873

2.2 双向数据绑定

        <div id="root">
            单行数据绑定: <input type="text"  :value="name">
            <br>
            双向数据绑定: <input type="text"  v-model:value="name">
        </div>

结果如下图

image-20231027215944645

当我们修改Vue中name时,我们发现两个文本框都会改变

image-20231027220040884

当我们修改双向绑定文本框的时候,我们发现Vue的name值也会改变 (单向文本框也会改变的原因是因为Vue的name值改变了)

image-20231027220118365

产生了一个类似下图的连锁反应

image-20231027220129363

三、el与data的两种写法

以后会在学组件的时候使用到el与data

3.1 el

  1. 第一种
        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false
            
           const v= new Vue({
              el:'#root',   //el第一种写法
              data:{
                name:'张靖奇'
              }
 
            })
         </script>   
  1. mount挂载更灵活
        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false
            
           const v= new Vue({
              data:{
                name:'张靖奇'
              }
 
            })
            v.$mount('#root')  //el第二种写法   mount是挂载的意思
        </script>   

在Vue实例中有几个很特别的属性,带着$符,这些都是给我们用的

不带$符的都不是给程序员用的(Vue底层自己在用)

我们使用$mount替换el

image-20231027221904048

image-20231027222130348

为什么说这种方式更灵活呢

比如下段代码我们设置了一个定时器,在1秒之后才将Vue实例和root容器关联

image-20231027222345738

为什么是mount

我们要把我们的模板root交给Vue实例进行解析,解析完之后将内容放到(挂载到)页面上指定位置展示

3.2 data

  1. 对象式
        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false
            
           const v= new Vue({
              el:'#root',  
            //data的第一种写法,对象式
               data:{
                name:'张靖奇'
             }
            })
            
        </script>   
  1. 函数式 (推荐)

    函数式必须要返回一个对象,对象中的数据就是我们所需要的

        <script type="text/javascript">
            //阻止vue在启动时生成生产提示
            Vue.config.productionTip=false
            
           const v= new Vue({
              el:'#root',  
 
            //data的第二种写法,函数式
               data:function(){
                return{
                    name:'张靖奇'
                }
               }
            })
            
        </script>   

而且我们的data函数是Vue帮我们调用的,我们可以验证一下

下图中的this是Vue实例对象 (前提是把下图中的data写成普通函数,如果写成箭头函数便不可以,因为箭头函数中没有this,就会往外找,找到全局的window)

由Vue管理的函数一定不要写成箭头函数,一旦写了箭头函数,this就不再是Vue实例了

   data:function(){
     console.log('@@@',this)
      return{
         name:'尚硅谷'
       }
     }

image-20231027223241642

我们一般都下面这样写,比较方便

   data(){
      return{
       }
     }

四、数据代理

数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)

4.1 Object.defineProperty

给一个对象添加或定义属性使用

比如下面有一个person对象,然后我们想增加一个“age”属性,怎么办?

 let person = {
            name: '张三',
            sex: '男',
        }

如下所示:

<script type="text/javascript">
        let number = 18
        let person = {
            name: '张三',
            sex: '男',
        }

        //参数一:给哪个对象添加参数
        //参数二:添加的参数叫什么名
        //参数三:配置项,可以写很多的配置
        bject.defineProperty(person, 'age', {
            value: 18,//这样就代表着age属性的值是18

            // 但是我们这样添加的元素无法进行枚举或者遍历
            // 为了我们新添加的age元素可以添加遍历,我们还需要一个配置
            enumerable: true,

            //除此之外,我们新添加的age属性在页面上无法修改,为了在页面上也可以修改,我们需要再进行配置
            // writable:true

            configurable: true,  //控制属性可以被删除

        })
</script>

假如我想把自定义的变量number赋值给person的新属性age怎么做

      <script type="text/javascript">
           let number =18
           let person ={
               name:'张三',
               sex:'男',
           }
           
            Object.defineProperty(person,'age',{

                enumerable:true,
                // writable:true,
 
                configurable:true , 
 
                //当有人读取person的age属性时,get函数或者说getter就会被调用,且返回值就是age的值
                get:function(){
                    console.log('有人读取了age属性')
                     return number
                },
                // 当有人修改person的age属性时,set函数或者说setter就会被调用,且会受到具体的值
                set(value){
                    console.log('有人修改了age属性时,且值是',value)
                    number=value
                }
            })
        </script>   

 

4.2 Vue数据代理

4.2.1 展示数据代理

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title> 初识vue</title>
        <!--引入vue    引入之后,全局就多了一个vue这个构造函数-->
        <script type="text/javascript" src="../js/vue.js>vue.js"></script> 
    </head>
    <body>
        <div id="root">
        </div>
 
        <script type="text/javascript">
           let obj= { x:100 } 
           let obj2={ y:200 }
              
       
           Object.defineProperty(obj2,'x',{
             //当有人想获取obj2中的x属性时,我们把obj的x属性给他
              get(){
                return obj.x
              },
             
            // setter被调用时说明有人想修改obj2的x
            //  当有人想修改obj2中x属性时,我们把obj中的x属性值给改掉就可以了
               set(value){
                obj.x=value
               }
 
           })
 
        </script>   
    </body>
</html>
 

效果如下图所示

image-20231028172004702

4.2.2 Vue数据代理

  • Vue中数据代理

​ 通过vm对象来代理data对象中属性的操作(读或写)

  • Vue中数据代理的好处

​ 更加方便的操作data中的数据。

我们在data中定义的数据,在Vue实例中是"_data"的形式存在,即vm._data=data

  • 基本原理

通过Object.defineProperty()把data对象中所有属性添加到vm上

为每个添加到vm上的属性都指定一个getter和setter

在getter/setter内部去操作(读或写)data中对应的属性

数据代理图示

image-20231028193500899

下图中右下角黄色和紫色的先就代表着数据代理

image-20231028194831487

假设我们没有数据代理,我们在使用插值语句的时候使用了**_data.xxxx**这样就增加了代码量,也非常的不方便,故我们使用了上面的数据代理

<!DOCTYPE html>
<html>
 <head>
     <meta charset="UTF-8">
     <title> 初识vue</title>
     <!--引入vue    引入之后,全局就多了一个vue这个构造函数-->
     <script type="text/javascript" src="../js/vue.js>vue.js"></script> 
 </head>
 <body>
     <div id="root">
         <h1> {{_data.name}}</h1>
         <h1> {{_data.address}}</h1>
     </div>

     <script type="text/javascript">
         //阻止vue在启动时生成生产提示
         Vue.config.productionTip=false 

         new Vue({
             el:'#root',
             data:{
                 name:'尚硅谷',
                 address:'洪福科技园'
             }
         })
     </script>   
 </body>
</html>

http://www.niftyadmin.cn/n/5130740.html

相关文章

leetcode_23合并K个升序链表

1. 题意 题意就是题目名字。。。 合并K个升序链表 2. 题解 2.1 分治 归并排序的思想 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(…

如何能够在发现问题和提问的时候一并带出自己的解决方案

1. 充分理解问题&#xff1a; 在提出问题之前&#xff0c;确保你已经完全理解了问题的本质。从不同的角度分析问题&#xff0c;确保没有遗漏任何重要的信息或者上下文。 2. 进行自我调查和研究&#xff1a; 在向他人寻求帮助之前&#xff0c;尝试自己解决问题。利用网络资源…

jenkins自动化操作步骤(gitblit)

1、登陆地址&#xff1a; http://xxxxxxxxx.org:xxxx/ admin/xxxx 2、创建任务 选择构建一个maven项目 3、配置 最多只保留一天一个任务 选择git仓库和账号密码 选择代码对应分支 build项&#xff1a; 1&#xff09;使用父项目的pom文件&#xff1a;k56-boot/pom.xml 2&…

Zotero背景设置护眼模式

一、背景知识 Zotero是开源的文献管理工具&#xff0c;功能非常强大&#xff0c;可以安装多款插件。对我来说&#xff0c;其最大的优点是可以对文章分类和打标签&#xff0c;因为某个瞬间&#xff0c;我经常想起论文中的一个图片&#xff0c;或者某个细节&#xff0c;但是却记…

云服务器搭建Spark集群

文章目录 1. Local 模式1.1 安装local模式1.2 命令行工具1.3 提交本地应用 2. Standlone模式2.1 集群配置2.2 修改配置文件2.3 启动集群与停止集群2.4 提交应用到集群环境2.5 提交应用的参数详细说明2.6 配置历史服务2.7 配置高可用&#xff08;HA&#xff09; 3. Yarn模式&…

Kubernetes - Ingress HTTP 负载搭建部署解决方案(新版本v1.21+)

在看这一篇之前&#xff0c;如果不了解 Ingress 在 K8s 当中的职责&#xff0c;建议看之前的一篇针对旧版本 Ingress 的部署搭建&#xff0c;在开头会提到它的一些简介Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客 开始表演 1、kubeasz 一键安装…

基于白鲸优化算法BWO优化的VMD-KELM光伏发电短期功率预测MATLAB代码(含详细算法介绍)

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; VMD适用于处理非线性和非平稳信号&#xff0c;例如振动信号、生物信号、地震信号、图像信号等。它在信号处理、振动分析、图像处理等领域有广泛的应用&#xff0c;特别是在提取信号中的隐含信息和去除噪声方面…

环形链表(C++解法)

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…