首页 > 其他分享 >VUE基础

VUE基础

时间:2024-08-17 21:51:57浏览次数:11  
标签:el VUE console log 基础 value Vue data

1.VUE简介
它是一个构建用户界面的框架 Vue是一个前端框架 js jq
Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任

1.1 介绍与描述
声明式渲染:Vue 基于标准 HTML 拓展了一套模板语法,使得我们可以声明式地描述最终输出的 HTML 和 JavaScript 状态之间的关系。
响应性:Vue 自动跟踪 JavaScript状态并在其发生变化时响应式地更新 DOM。
渐进式框架:Vue 是一个框架,也是一个生态。其功能覆盖了大部分前端开发常见的需求。

1.2 Vue 的特点

  1. 遵循 MVVM 模式
  2. 编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发3. 它本身只关注UI, 也可以引入其它第三方库开发项目

1.3 与其它 JS 框架的关联

  1. 借鉴 Angular 的模板和数据绑定技术
  2. 借鉴 React 的组件化和虚拟 DOM 技术

1.4 Vue 周边库

  1. vue-cli: vue 脚手架
  2. vue-resource
  3. axios :异步
  4. vue-router: 路由
  5. vuex: 状态管理
  6. element-ui: 基于 vue 的 UI 组件库(PC 端)
    ……
  1. MVVM的思想
    2.1 MVVM 设计思想

MVC
|--M Model (domain,service,serviceimpl.utils.pojo.mapper)
|--V view thymeleaf jsp html ${user}
|--C controller 接收前端请求(控制器)

Model:对应数据层的域模型,它主要做域模型的同步。通过 Ajax/fetch 等 API 完成客户端和服务端业务 Model 的同步。在模型层间关系里,它主要用于抽象出 ViewModel 中视图的 Model。个人理解:后端提供API,后端服务架构是 控制器+数据模型 或者 纯控制器。
View:View是作为视图模板,用于定义结构、布局。它自己不处理数据,只是将ViewModel中的数据展现出来。此外为了和ViewModel产生关联,那么还需要做的就是数据绑定的声明,指令的声明,事件绑定的声明。ViewModel和View之间是双向绑定,意思就是说ViewModel的变化能够反映到View中,View的变化也能够改变ViewModel的数据值。
ViewModel:ViewModel起着连接View和Model的作用,同时用于处理View中的逻辑。在MVC框架中,视图模型通过调用模型中的方法与模型进行交互,然而在MVVM中View和Model并没有直接的关系,在MVVM中,ViewModel从Model获取数据,然后应用到View中。个人理解:Web前端的webserver对View进行双向绑定渲染。
整个MVVM实际上实现了前后端分离,通过api来实现前后端交互,前端通过纯js或者双向绑定框架来渲染页面。
前后端不分离(car 页面写在car项目里面 html thymeleaf(模板引擎) )
前后端分离

大概如:
数据库(MySQL、PostgreSQL)<—双向交互—>api(php、java、Python、node)<—双向交互—>ajax/fetch/websocket(node服务、jQ、js)<—双向绑定—>html(标签、css)。
MVVM有利于项目分工和升级,所谓对前后端分离。但也有缺点,就是不利于SEO 。
也就是搜索引擎优化的逻辑,简单说就是内部优化和外部优化困难 。
MVC:服务端来渲染数据,老旧模式。MC属于纯后端,V属于前端,js权重不高,有利于SEO。
万物基于api,一套api可以针对小程序、app、前端,为何不首先使用。需要SEO对部分,单独分离出项目,采用MVC渲染静态页面或者纯html即可。
2.2 MVVM图例解析

  1. 安装和部署
    IDEA中直接使用插件 vue 下载即可
    让Idea识别vue语法

3.1 直接下载并用<script> 标签引入
Vue 会被注册为一个全局变量。
在开发环境下不要使用压缩版本,不然你就失去了所有常见错误相关的警告!
开发版本包含完整的警告和调试模式
https://cn.vuejs.org/v2/guide/installation.html

3.2 CDN
对于制作原型或学习,你可以这样使用最新版本:
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
对于生产环境,我们推荐链接到一个明确的版本号和构建文件,以避免新版本造成的不可预期的破坏:
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
3.3 NPM(后面讲)
在用 Vue 构建大型应用时推荐使用 NPM 安装[1]。NPM 能很好地和诸如 webpack 或 Browserify 模块打包器配合使用。同时 Vue 也提供配套工具来开发单文件组件。

# 最新稳定版
$ npm install vue

3.4 浏览器安装开发者工具
Chrome浏览器安装Vue.js devtools插件
注意:Chrome浏览器版本过低需要找低版本的crx文件
1、浏览器访问极简插件
https://chrome.zzzmh.cn/#/index

2、右上角搜索框搜索vue DevTools插件

3、在本地文件夹中解压刚刚下载的插件,解压后如下所示

4、打开谷歌浏览器--更多工具--拓展程序
注意:打开开发者模式

5、将解压的文件夹拉到4中拓展程序页面

6、安装成功

  1. VUE的基本格式
<!-- 引入Vue -->
<script type="text/javascript" src="./js/vue.js"></script>
格式:
new Vue({
Key:value,
Key:value,
Key:value,
...
Key:value
})
key是固定值:el,data,methods...我们会逐个介绍

5.Vue的基本语法
Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析。
在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数。结合响应系统,Vue 能够智能地计算出最少需要重新渲染多少组件,并把 DOM 操作次数减到最少。

5.1 插值语法
格式:{{XXX}}
功能:用于解析标签体内容。
写法:xxx是js表达式,且可以直接读取到data中的所有属性。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>初识Vue</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="./js/vue.js"></script>
</head>
<body>
<!-- 准备好一个容器
    root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法;
 -->
<div id="demo">
    <h1>Hello,{{name.toUpperCase()}},{{address}}</h1>
</div>
<script type="text/javascript" >
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    /* 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象;*/
    //创建Vue实例  Vue实例和容器是一一对应的
    new Vue({
        el:'#demo', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串。
        data:{ //data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。
            name:'dalang',
            address:'北京'
        }
    })
</script>
</body>
</html>

5.2 v-text,v-html,v-pre,v-once指令

<span id=”aaa”></span>
$(“#aaa”).html(‘<font color=red>RED</font>’)
$(“#aaa”).text(‘<font color=red>RED</font>’)

5.2.1 v-text
v-text主要用来更新textContent,可以等同于JS的text属性。
<span v-text="msg"></span>
这两者等价:
<span>{{msg}}</span>
5.2.2 v-html
双大括号的方式会将数据解释为纯文本,而非HTML。为了输出真正的HTML,可以用v-html指令。它等同于JS的innerHtml属性。
或者jquery的$().html(aaa)
<div v-html="rawHtml"></div>
这个div的内容将会替换成属性值rawHtml,直接作为HTML进行渲染。
5.2.3 v-pre
v-pre主要用来跳过这个元素和它的子元素编译过程。可以用来显示原始的Mustache标签。跳过大量没有指令的节点加快编译。

<div id="app">
    <span v-pre>{{message}}</span> //这条语句不进行编译
    <span>{{message}}</span>
</div>

最终仅显示第二个span的内容
5.2.4 v-once
v-once关联的实例,只会渲染一次。之后的重新渲染,实例极其所有的子节点将被视为静态内容跳过,这可以用于优化更新性能。

<span v-once>This will never change:{{msg}}</span> //单个元素
<div v-once>//有子元素
    <h1>comment</h1>
    <p>{{msg}}</p>
</div>

上面的例子中,msg即使产生改变,也不会重新渲染。

5.3 数据绑定

1,v-bind 字面意思为绑定。是vue中提供的用户绑定属性的指令。
v-bind可简写成 :
2,v-model 只能用于表单元素的双向绑定指令
Vue中有2种数据绑定的方式:
1.单向绑定(v-bind):数据只能从data流向页面。
2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。

备注:

1.双向绑定一般都应用在表单类元素上(如:input、select等)
2.v-model:value可以简写为v-model,v-model默认收集的就是value值。

<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8" />
      <title>数据绑定</title>
      <!-- 引入Vue -->
      <script type="text/javascript" src="./js/vue.js"></script>
   </head>
   <body>
      <!-- 准备好一个容器-->
      <div id="root">
         <!-- 普通写法 -->
         <!-- 单向数据绑定:<input type="text" v-bind:value="name"><br/>
         双向数据绑定:<input type="text" v-model:value="name"><br/> -->

         <!-- 简写 -->
         单向数据绑定:<input type="text" :value="name"><br/>
         双向数据绑定:<input type="text" v-model="name"><br/>
         <!-- 如下代码是错误的,因为v-model只能应用在表单类元素(输入类元素)上 -->
         <!-- <h2 v-model:x="name">你好啊</h2> -->
      </div>
   </body>
   <script type="text/javascript">
      Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

      new Vue({
         el:'#root',
         data:{
            name:'你好'
         }
      })
   </script>
</html>

5.4 双向绑定v-model 小练习

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/vue.js"></script>
</head>

<body>
  <div id ="app">
    <input v-model="number1" />
    <select v-model="opt" >
      <option value="+">+</option>
      <option value="-">-</option>
      <option value="*">*</option>
      <option value="÷">÷</option>
    </select>
    <input v-model="number2"  />
    <button @click="compute">=</button>
    <input v-model="cutNumber"/>
  </div>

  <script>
   //创建Vue实例,得到 ViewModel
   var vm = new Vue({
    el: '#app',
    data: {
      number1:0,
      number2:0,
      opt:'+',
      cutNumber:0
    },
    methods: {
      compute(){
        switch(this.opt){
          case '+':
            this.cutNumber=parseInt(this.number1)+parseInt(this.number2)
            break;
          case '-':
            this.cutNumber=parseInt(this.number1)-parseInt(this.number2)
            break;
          case '*':
            this.cutNumber=parseInt(this.number1)*parseInt(this.number2)
            break;
          case '÷':
            this.cutNumber=parseInt(this.number1)/parseInt(this.number2)
            break;
        }
      }
    }
   });
  </script>
</body>

</html>

5.5 El和data的两种格式
data与el的2种写法
> 1.el有2种写法

  (1).new Vue时候配置el属性。
  (2).先创建Vue实例,随后再通过vm.$mount('#root')指定el的值。

2.data有2种写法
(1).对象式
(2).函数式
如何选择:目前哪种写法都可以,
以后学习到组件时,data必须使用函数式,否则会报错。
3.一个重要的原则:
由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。

<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8" />
      <title>el与data的两种写法</title>
      <!-- 引入Vue -->
      <script type="text/javascript" src="./js/vue.js"></script>
   </head>
   <body>
      <!-- 准备好一个容器-->
      <div id="root">
         <h1>你好,{{name}}</h1>
      </div>
   </body>

   <script type="text/javascript">
      Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
      //el的两种写法
      /* const v = new Vue({
         //el:'#root', //第一种写法
         data:{
            name:'世界1'
         }
      })
      console.log(v)
      v.$mount('#root') //第二种写法 */

      //data的两种写法
      new Vue({
         el:'#root',
         //data的第一种写法:对象式
         /* data:{
            name:'世界'
         } */

         //data的第二种写法:函数式
         data(){
            console.log('@@@',this) //此处的this是Vue实例对象
            return{
               name:'世界2'
            }
         }
      })
   </script>

5.6 事件绑定
5.6.1 基本使用

在以前的开发中。我们使用onclick等属性去设置点击事件,在vue 中可以使用v-on去设置方式,可简写成@
使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名;
事件的回调需要配置在methods对象中,最终会在vm上

<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8" />
      <title>事件的基本使用</title>
      <!-- 引入Vue -->
      <script type="text/javascript" src="../js/vue.js"></script>
   </head>
   <body>
      <!-- 准备好一个容器-->
      <div id="root">
         <h2>欢迎来到{{name}}</h2>
         <!-- <button v-on:click="showInfo">点我提示信息</button> -->
         <button @click="showInfo1">点我提示信息1(不传参)</button>
         <button @click="showInfo2($event,66)">点我提示信息2(传参)</button>
      </div>
   </body>

   <script type="text/javascript">
      Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
      const vm = new Vue({
         el:'#root',
         data:{
            name:'英雄联盟',
         },
         methods:{
            showInfo1(event){
               // console.log(event.target)
               // console.log(event.target.innerText)
               // console.log(this) //此处的this是vm
               alert('召唤师你好!')
            },
            showInfo2(event,number){
               console.log(event,number)
               // console.log(event.target.innerText)
               // console.log(this) //此处的this是vm
               alert('青铜嘴强王者--你好!!')
            },
           /*show1:()=>{
                alert("show1")
              console.log("show1是被谁调用的:",this)//箭头函数的this指向window
             }*/
         }
      })
   </script>
</html>

注意:methods中配置的函数,不要用箭头函数!否则this就不是vm了;
@click="demo" 和 @click="demo($event)" 效果一致,但后者可以传参;
函数的调用和$event
事件的方法名不带圆括号 的形式,event对象将被自动当做实参传入;
事件的方法名带圆括号的形式,我们需要把$event变量作为参数,显式传入方法中。

<body>
   <div id="app">
      <input type="checkbox"  @click="click" > 方法名称,不带括号 <br>
      <input type="checkbox"  @click="click2()" > 方法名称,后面有括号  <br>
<input type="checkbox"  @click="click4(233)" > clickMe <br>
   </div>
</body>
<script>
   var app = new Vue({
      el: '#app',
      methods: {
         click(event) {
            console.log("方法名称,不带括号",event);    // object
         },
         click2(event) {
            console.log("方法名称,后面有括号",event);    // undefined
         },
click4(val) {
         console.log("传参没有传递$event",event);    // object
        alert(val)
       }
      }
   });
</script>

$event:传递参数使用 传参时不写$event可以吗?
以前不可以!
既没有传入实参,也没有接收的形参,这个 event对象的来源,window.event。
5.6.2 事件修饰符

  1. prevent:阻止默认事件(常用)
    本身含有事件阻止本身事件,触发vue绑定的事件
    2.stop:阻止事件冒泡(常用)
    当父子元素中都有点击事件的时候,为了让触发子元素中的事件时,不去触 发父元素中的事件,可以在子元素事件中添加stop来阻止事件冒泡;
    3.once:事件只触发一次(常用);
    4.capture:使用事件的捕获模式;
<!DOCTYPE html>
<html>
   <head>
      <meta charset="UTF-8" />
      <title>事件修饰符</title>
      <!-- 引入Vue -->
      <script type="text/javascript" src="./js/vue.js"></script>
      <style>
         *{
            margin-top: 20px;
         }
         .demo1{
            height: 50px;
            background-color: skyblue;
         }
         .box1{
            padding: 5px;
            background-color: skyblue;
         }
         .box2{
            padding: 5px;
            background-color: orange;
         }
         .list{
            width: 200px;
            height: 200px;
            background-color: peru;
            overflow: auto;
         }
         li{
            height: 100px;
         }
      </style>
   </head>
   <body>
      <!-- 准备好一个容器-->
      <div id="root">
         <h2>欢迎来到{{name}}</h2>
         <!-- 阻止默认事件(常用) -->
         <a href="http://www.baidu.com" @click.prevent="showInfo">点我提示信息</a>
         <!-- 阻止事件冒泡(常用) -->
         <div class="demo1" @click="showInfo">
            <button @click.stop="showInfo">点我提示信息</button>
            <!-- 修饰符可以连续写 -->
            <!-- <a href="http://www.baidu.com" @click.prevent.stop="showInfo">点我提示信息</a> -->
         </div>
         <!-- 事件只触发一次(常用) -->
         <button @click.once="showInfo">点我提示信息</button>
         <!-- 使用事件的捕获模式 -->
         <div class="box1" @click.capture="showMsg(1)">
            div1
            <div class="box2" @click="showMsg(2)">
               div2
            </div>
         </div>
      </div>
   </body>

   <script type="text/javascript">
      Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
      new Vue({
         el:'#root',
         data:{
            name:'德莱联盟'
         },
         methods:{
            showInfo(e){
               alert('嘴强王者--你好!')
               // console.log(e.target)
            },
            showMsg(msg){
               console.log(msg)
            }
         }
      })
   </script>
</html>

5.6.3 鼠标键盘事件(玩玩)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./lib/vue.js"></script>
</head>

<body>
  <div id ="app">
    <img :src="src"  width="200" height="200"  v-bind:title="title" />
    <img src="images/bmw.png" width="250" height="250" :title="title" />
    <div>{{title}}</div>
    <br>
    <a href="http://www.baidu.com">去百度</a>
    <a :href="baidu">去百度</a>
    <br>
    <input :value="title" />
    <!-- 事件绑定 -->
    <img :src="src" v-on:click="toBadu"  width="200" height="200" v-bind:title="title" />
    <img :src="src" @click="toBadu"  width="200" height="200" v-bind:title="title" />
    <br />
    <select @change="chageCity">
      <option value="">请选择</option>
      <option value="武汉">武汉</option>
      <option value="北京">北京</option>
      <option value="上海">上海</option>
      <option value="广州">广州</option>
    </select>
    <input type="text" @focus="getFocus" @blur="lostFocus" :value="currentSelectCity">

    <div style="width: 300px;height: 300px;background-color: blue;"
      @mouseEnter="mouseEnterfun"
      @mouseMove="mouseMovefun"
      @mouseOut="mouseOutfun"
      @mouseDown="mouseDownfun"
      @mouseUp="mouseUpfun"
    ></div>
<hr>
<input type="text" v-model="msg" />
<div>{{msg}}</div>
<button @click="chageMsg">使用JS改成msg的值</button>
  </div>

  <script>
   //创建Vue实例,得到 ViewModel
   var vm = new Vue({
    el: '#app',
    data: {
      title:'BMW',
      baidu:"http://www.baidu.com",
      src:"images/bmw.png",
      currentSelectCity:undefined,
      msg:"的是输入框的内容"
    },
    methods: {
      toBadu(){
        window.location.href=this.baidu
      },
      chageCity(x){
        console.log(x.srcElement.value);
        this.currentSelectCity=x.srcElement.value
      },
      getFocus(){
        console.log("得到焦点")
      },
      lostFocus(){
        console.log("失去焦点")
      },
      mouseEnterfun(){
        console.log("鼠标进入")
      },
      mouseMovefun(obj){
        console.log("鼠标移动x:"+obj.x+" y"+obj.y)
      },
      mouseOutfun(){
        console.log("鼠标出去")
      },
      mouseDownfun(){
        console.log("鼠标按下")
      },
      mouseUpfun(){
        console.log("鼠标弹起")
      },
      chageMsg(){
        this.msg="我是改变之后的值"
      }
      
    }
   });
  </script>
</body>
</html>

5.6.4 练习:数组操作

<!--给按钮添加单击事件,完成按钮中的功能-->
<div id="app">
    <button v-on:click="mth1">在下标为2的地方添加一条记录数据</button>
    <button v-on:click="mth2">在最后面添加一条记录数据</button>
    <button v-on:click="mth3">删除2的一条记录数据</button>
    <button v-on:click="mth4">删除最后一条记录数据</button>
    <button @click="mth5">在console控制台遍历userList数组</button>
</div>
<script type="text/javascript">
    let vue = new Vue({
        el:"#app",
        data:{
            userList:[
                {id:1,name:"小明",address:"武汉",sex:1},
                {id:2,name:"小红",address:"东莞",sex:0},
                {id:3,name:"小芳",address:"佛山",sex:0},
                {id:4,name:"小丽",address:"深圳",sex:0}
            ]
        },
        methods:{
            mth1:function(){
                this.userList.splice(2,-1,{id:5,name:"小丽力",address:"深圳",sex:1})
            },
            mth2:function(){
                this.userList.push({id:6,name:"小丽力1",address:"深圳",sex:1})
            },
            mth3:function(){
                this.userList.splice(2,1)
            },
            mth4:function(){
                this.userList.pop();
            },
            mth5:function(){
                for(let index in this.userList){
                    console.log(this.userList[index]);
                }
            }
        }
    });</script>

5.7 判断属性
v-if

格式:
(1)v-if="表达式"
(2)v-else-if="表达式"
(3)v-else="表达式"
适用于:切换频率较低的场景。
特点:不展示的DOM元素直接被移除。
注意:v-if可以和:v-else-if、v-else一起使用,要求结构不能被“打断”。

<div id="app">
    <button v-on:click="mth1">修改flag值</button>
    <p v-if="flag==true">我是true</p>
    <p v-else>我是false</p>
</div>
 new Vue({
    el:"#app",
    data: {
        flag: false
    },
    methods:{
        mth1:function(){
            this.flag = !this.flag;
        }
    }
});
<div id="app">
    请输入成绩: <input type="text" v-model="score">
    <hr>
    <p v-if="score>'90'">优秀</p>
    <p v-else-if="score>'80'">良好</p>
    <p v-else-if="score>'70'">一般</p>
    <p v-else-if="score>='60'">及格</p>
    <p v-else>不及格</p>
</div>
new Vue({
    el:"#app",
    data:{
        score:'99'
    }});

v-show

写法:v-show="表达式"
适用于:切换频率较高的场景。
特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。

<p v-show="flag">我是show方法</p>
<p v-show="n==1">我是show方法</p>

5.8 循环属性
v-for:
> 1.用于展示列表数据

2.语法:v-for="(item, index) in xxx" :key="yyy"
3.可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)

<div id="root">
    <!-- 遍历数组 -->
    <h2>人员列表(遍历数组)</h2>
    <ul>
        <li v-for="(p,index) of persons" :key="index">
            {{p.name}}-{{p.age}}
        </li>
    </ul>
    <!-- 遍历对象 -->
    <h2>汽车信息(遍历对象)</h2>
    <ul>
        <li v-for="(value,k) of car" :key="k">
            {{k}}-{{value}}
        </li>
    </ul>
    <!-- 遍历字符串 -->
    <h2>测试遍历字符串(用得少)</h2>
    <ul>
        <li v-for="(char,index) of str" :key="index">
            {{char}}-{{index}}
        </li>
    </ul>
    <!-- 遍历指定次数 -->
    <h2>测试遍历指定次数(用得少)</h2>
    <ul>
        <li v-for="(number,index) of 5" :key="index">
            {{index}}-{{number}}
        </li>
    </ul>
</div>

<script type="text/javascript">
    Vue.config.productionTip = false
    new Vue({
        el:'#root',
        data:{
            persons:[
                {id:'001',name:'张三',age:18},
                {id:'002',name:'李四',age:19},
                {id:'003',name:'王五',age:20}
            ],
            car:{
                name:'奥迪A8',
                price:'70万',
                color:'黑色'
            },
            str:'hello'
        }
    })
</script>

5.9 表单数据
<input type="text"/>
则v-model收集的是value值,用户输入的就是value值。
<input type="radio"/>
则v-model收集的是value值,且要给标签配置value值。
<input type="checkbox"/>

1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值)
2.配置input的value属性:
(1)v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值)
(2)v-model的初始值是数组,那么收集的的就是value组成的数组
备注:v-model的三个修饰符:
lazy:失去焦点再收集数据
number:输入字符串转为有效的数字
trim:输入首尾空格过滤

<div id="root">
      <form @submit.prevent="demo">
         账号:<input type="text" v-model.trim="userInfo.account"> <br/><br/>
         密码:<input type="password" v-model="userInfo.password"> <br/><br/>
         年龄:<input type="number" v-model.number="userInfo.age"> <br/><br/>
         性别:
         男<input type="radio" name="sex" v-model="userInfo.sex" value="male">
         女<input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br/><br/>
         爱好:
         学习<input type="checkbox" v-model="userInfo.hobby" value="study">
         打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
         吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat">
         <br/><br/>
         地址
         <select v-model="userInfo.city">
            <option value="">请选择校区</option>
            <option value="beijing">北京</option>
            <option value="shanghai">上海</option>
            <option value="shenzhen">深圳</option>
            <option value="wuhan">武汉</option>
         </select>
         <br/><br/>
         其他信息:
         <textarea v-model.lazy="userInfo.other"></textarea> <br/><br/>
         <input type="checkbox" v-model="userInfo.agree">阅读并接受<a href="http://www.baidu.com">《用户协议》</a>
         <button>提交</button>
      </form>
   </div>
</body>

<script type="text/javascript">
   Vue.config.productionTip = false

   new Vue({
      el:'#root',
      data:{
         userInfo:{
            account:'',
            password:'',
            age:18,
            sex:'female',
            hobby:[],
            city:'beijing',
            other:'',
            agree:''
         }
      },
      methods: {
         demo(){
            console.log(JSON.stringify(this.userInfo))
         }
      }
   })
  1. 过滤器(了解)
    6.1 过滤器:
    定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。
    语法:

1.注册过滤器:Vue.filter(name,callback) 或 new Vue{filters:{}}
2.使用过滤器:{{ xxx | 过滤器名}} 或 v-bind:属性 = "xxx | 过滤器名"

备注:
1.过滤器也可以接收额外参数、多个过滤器也可以串联
2.并没有改变原本的数据, 是产生新的对应的数据
6.1.1 局部过滤器

<div id="app">
//过滤器传参是直接把前面的参数传递给过滤器  利用管道符
    <p>性别: {{sex==1?"男":"女"}}</p>
    <p>性别: {{sex|sexFilter}}</p>
    <p>系统时间: {{date|dateFilter}}</p>
    <p>薪资: {{money|moneyFilter}}</p>
<!-- 多个过滤器串联  参数会传递给第一个过滤器  第一个过滤器过滤后的结果再传给第二个过滤器 -->
<h3>现在是:{{time | dateFilter | moneyFilter}}</h3>
</div>
<script type="text/javascript">
    let vue = new Vue({
        el:"#app",
        data:{
            sex:1,
            date:new Date(),
            money:3.1415926
        },
        filters:{
            /*性别格式化过滤器*/
            sexFilter:function(value){
                return value==1?"男":"女";
            },
            /*时间格式化过滤器*/
            dateFilter:function(value){
                return value.getFullYear()+"年"+(value.getMonth()+1)+"月"+value.getDate()+"日";
            },
            /*薪资格式化过滤器*/
            moneyFilter(value){
                return value.toFixed(2)+"¥";
            }
        },
        methods:{}
    });

6.1.2 全局过滤器
把过滤器注册到vue对象上

<div id="app">
    <p>性别: {{sex==1?"男":"女"}}</p>
    <p>性别: {{sex|sexFilter}}</p>
    <p>系统时间: {{date|dateFilter}}</p>
    <p>薪资: {{money|moneyFilter}}</p>
</div>
/*性别格式化过滤器*/
Vue.filter("sexFilter",function(value){
    return value==1?"男":"女";
});
/*时间格式化过滤器*/
Vue.filter("dateFilter",function(value){
    return value.getFullYear()+"年"+(value.getMonth()+1)+"月"+value.getDate()+"日";
});
/*薪资格式化过滤器*/
Vue.filter("moneyFilter",function(value){
    return value.toFixed(2)+"¥";
});
let vue = new Vue({
    el:"#app",
    data:{
        sex:1,
        date:new Date(),
        money:3.1415926
    }
});
  1. Vue的生命周期
    Vue的生命周期就是vue实例从创建到销毁的全过程,也就是new Vue() 开始就是vue生命周期的开始。Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom -> 渲染、更新 -> 渲染、卸载 等⼀系列过程,称这是Vue的⽣命周期。钩子函数是Vue生命周期中每个阶段对外开放让程序员操作Vue的接口。Vue有8个钩子函数。
    beforeCreate( 创建前 )
    这个时候,在实例被完成创建出来,el和data都没有初始化,不能访问data、method,一般在这个阶段不进行操作。
    created( 创建后 )
    这个时候,vue实例中的data、method已被初始化,属性也被绑定,但是此时还是虚拟dom,真是dom还没生成,$el 还不可用。这个时候可以调用data和method的数据及方法,created钩子函数是最早可以调用data和method的,故一般在此对数据进行初始化。
    beforeMount( 挂载前)
    此时模板已经编译完成,但还没有被渲染至页面中(即为虚拟dom加载为真实dom),此时el存在则会显示el。在这里可以在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取。
    当vue实例中,el为挂载目标,未对el进行定义,则this.el显示undefined,但页面中存在template也能识别挂载目标,因为template可以被看成占位符。如果对其进行定义则显示,故所以,beforeMount读取不了真实的el,在mounted才能读取到真实的el,因为el只有渲染完成后才会存在。这里讲的el是真实的el。在真实的el之前存在前,在beforeMount中的其实是页面中的#app,是挂载的目标。
    Mounted( 挂载后)
    此时模板已经被渲染成真实DOM,用户已经可以看到渲染完成的页面,页面的数据也是通过双向绑定显示data中的数据。 这实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,此时,如果没有其它操作的话,这个实例,就静静的躺在我们的内存中,一动不动。
    beforeUpdate
    更新前状态(view层的数据变化前,不是data中的数据改变前),重新渲染之前触发,然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染。只有view上面的数据变化才会触发beforeUpdate和updated,仅属于data中的数据改变是并不能触发。
    updated
    数据已经更改完成,dom也重新render完成。
    beforeDestroy
    销毁前执行($destroy方法被调用的时候就会执行),一般在这里善后:清除计时器、清除非指令绑定的事件等等…’)
    destroyed
    销毁后(Dom元素存在,只是不再受vue控制),卸载watcher,事件监听,子组件。
<body>
    <div id="app">
        <p>{{num}}</p>
        <button @click="addNum()">num++</button>
        <button @click="killVue();">销毁</button>
    </div>
    <script>
        new Vue({
            el:"#app",
            data(){
                return {
                    num:1,
                }
            },
            methods:{
                addNum(){
                    console.log("执行add方法")
                    this.num++;
                },
                killVue(){
                    this.$destroy();
                }
            },
            beforeCreate(){
                console.log("beforeCreate",this.num)
            },
            created(){
                console.log("create",this.num)
            },
            beforeMount(){
                console.log("beforeMount",this.num)
            },
            mounted(){
                console.log("Mount",this.num)
            },
            beforeUpdate(){
                console.log("beforeUpdate:",this.num)
                //debugger  断点模式
            },
            updated(){
                console.log("Updated:",this.num)
               // debugger
            },
            //主动销毁   被动销毁
            beforeDestroy(){
                console.log("beforeDestroy",this.num)
                this.addNum()
            },
            destroyed(){
                console.log("destroyed",this.num)
            }
        });
    </script>

标签:el,VUE,console,log,基础,value,Vue,data
From: https://www.cnblogs.com/llhcmbs/p/18365033

相关文章

  • Vue脚手架
    【Vue的环境搭建】1.【掌握】node和npm的说明1.1什么是node和npmNode:是JavaScript的运行时环境。Node并不是一个新的语言,只是js的一个环境,同样的比如:tomcat。Node为js提供了更强大的操作方式,如:在浏览器中,js是无法操作文件的,而node提供了文件操作。在浏览器中,js无法写服务接口,no......
  • 【面试宝典】java基础面试题总结[上]
    一、Java中有几种基本数据类型?各占多少字节?在Java中基本数据类型有8个,占用的字节分别是整型byte(1个字节)、short(2个字节)、int(4个字节)、long(8个字节);浮点型float(4个字节)、double(8个字节);布尔类型boolean;字符类型char(2个字节)。二、String类能被继承吗?为什么?Stri......
  • Asp.net core SignalR + Vue
    简介:ASP.NETSignalR是一个ASP.NET下的类库,可以在ASP.NET的Web项目中实现实时通信。本文主要讲述如何在Vue.js中使用SignalR,以及断开重连。知识点:前端SignalR的安装如何设置自动重新连接的次数SignalR有关连接的函数自动重连全部失败后,定时重连ASP.NETCORESig......
  • 012、Vue3+TypeScript基础,子页面使用defineExpose暴露成员来给主页面使用
    01、App.vue代码如下:<template><divclass="app"><h2>{{title}}</h2><button@click="showLog">点我数组子页面年龄</button><!--使用了ref来获取子组件的属性--><Personref="person001"/......
  • 二分查找不理解?一篇弄懂!--基础二分查找算法详细解释(带简单例题的详细解法)
    本文参考:灵茶山艾府分享丨【题单】二分算法(二分答案/最小化最大值/最大化最小值/第K小)-力扣(LeetCode)二分查找红蓝染色法_哔哩哔哩_bilibili本文主要详细讲解基础的二分算法中的查找,包括原理和模板,并用leetcode和洛谷的一些例题来进行实际题目讲解,如果觉得有帮助或者写......
  • 011、Vue3+TypeScript基础,template中ref的用法意义
    1、如果多个页面都用同一个id,那么就会报错。用ref可以指明是某个元素,规避报错情况。App.vue代码如下:<template><divclass="app"><h2ref="title2">好好学习,天天向上</h2><button@click="showLog">点我输出h2元素</button><Person/&g......
  • 「OC」探索CALayer:基础知识与实用技巧简要介绍
    「OC」探索CALayer:基础知识与实用技巧简要介绍文章目录「OC」探索CALayer:基础知识与实用技巧简要介绍前言认识CALayerCALayer的相关属性UIView和CALayer区别联系创建UIView和CALayer的原因开始创建CALayer视图层级CALayers和Sublayersposition与anchorPoint(锚点)CGIm......
  • Java基础——面向对象编程高级(常见关键字)
    package:用于声明一个类或接口所属的包(即命名空间)语法格式:package顶层包名.子包名OrderController类属于包com.hxzs.order.controller一个源文件只能有一个声明包的package语句package语句作为Java源文件的第一条语句出现。若缺省该语句,则指定为无名包。包名,属于标识符,满......
  • 010、Vue3+TypeScript基础,通过toRefs和toRef把对象的属性变成响应式引用
    1、App.vue代码如下:<template><divclass="app"><h1>好好学习,天天向上</h1><Person/></div></template><script>//JS或TSimportPersonfrom'./view/Person.vue'exportdefault{//A......
  • HTML基础总结
    HTMLHTML4编辑器:VsCodeVsCode中的快捷键:标准结构!删除当前行中的内容ctrl+shift+k注释:语法:<!---->字符编码:默认:绝大多数浏览器认为你使用UTF-8编码,因此会用UTF-8解码语法:<head> <metacharset="utf-8"></head>过程:源代码to编码to编码后的进......