vuejs使用笔记---component内部实现

新科程序猿 新科程序猿     2022-08-03     368

关键词:

现在来系统地学习一下Vue(参考vue.js官方文档):

Vue.js是一个构建数据驱动的web界面的库,其目标是实现响应的数据绑定组合的试图组件。

Vue.js拥抱数据驱动的视图概念,这意味着我们能在普通的HTML模板中使用特殊的用法将DOM“绑定”到底层数据。一旦创建了绑定,DOM将于数据保持同步。

以下参考代码与上面的模型相对应

<!-- 这是我们的 View -->
<div id="example-1">
      Hello {{ name }}!
</div>
// 这是我们的 Model
var exampleData = {
      name: 'Vue.js'
}

// 创建一个 Vue 实例或 "ViewModel"
// 它连接 View 与 Model
var exampleVM = new Vue({
     el: '#example-1',   // 在一个id为'example-1'的实体上挂载
     data: exampleData   // 数据流
})

通常我们会把Model写在Vue实例当中,下面写法与上面写法效果一样:

<!-- 这是我们的 View -->
<div id="example-1">
      Hello {{ name }}!    <!--- Vue的数据模型用{{datamodel}}包裹起来 --->
</div>

// 创建一个 Vue 实例或 "ViewModel"
// 它连接 View 与 Model
<script> var exampleVM = new Vue({ el: '#example-1', // 在一个id为'example-1'的实体上挂载 data: { name: 'Vue.js' } // 数据流 })
</script>

这样一段程序执行后,在#example-1这个控件中就会显示‘Hello Vue.js!’。

  • 下面来看看指令(Directives):

指令是特殊的带有前缀 v- 的特性,指令的值限定为绑定表达式,比如一个if的指令:

<p v-if="greeting">hello!<p>

还有绑定指令,即将某些属性值与一些值相绑定,比如:

<input :type = "questItem.type", :name = "questItem.name"/> 

这里省略了“v-bind”,使得input的属性值赋值具有“计算”的效果。

 

  • 计算属性

这里介绍一下$watch的用法,用于当一个数据需要根据其他的数据而变化时的情况:

<script>
var vm = new Vue({ el: '#demo', data: { firstName: 'Foo', lastName: 'Bar', fullName: 'Foo Bar' } })
</script> vm.$watch('firstName', function (val) { // 当firstname改变时,立马更新vm.fullname this.fullName = val + ' ' + this.lastName }) vm.$watch('lastName', function (val) { // 当lastname改变时,立马更新vm.fullname this.fullName = this.firstName + ' ' + val })

在这里,所有的数据的对象都可以通过vm.firstname等来访问。  

 

  • v-model  

顾名思义,就是Vue当中的数据模型,它用来绑定Vue实例中的数据:

<!---  bi-direction bound  --->
<div id="app">
    <p>{{message}}</p>
    <input v-model="message">  <!--Model,input输入的数据会立即反馈到Vue实例中-->  
</div>
<script>
    new Vue({
        el: '#app',   // View
        data: {
            message: 'Hello Vue.js'
        }
    })
</script>

比如要用来绑定一个表单控件,就是把选择的值显示出来:

<!---       表单控件绑定-单选 --->
<div id="myselect">   // 外面这一层我一开始没有加,然后就出错了,el好像一般是挂载在<div>构件上
<select v-model="selected">  // data的数据类型是selected,值是选取的值
    <option seleceted>A</option>
    <option>B</option>
    <option>C</option>
</select>
<span>Selected: {{ selected }}</span>
</div>

<script>
    new Vue({
        el: '#myselect',
        data:{
            selected:[]
        }
    })
</script>

 

  • v-if, v-else    

这个指令可以用的很灵活,比如我在表单中生成新题目,有“单选题”、“多选题”、“文本题”三种,那么针对不同的题目应该显示的控件有所不同,这时可以使用如下语法:

<div v-if="questItem.type === 'textarea'">  // 注意是三个等号
       <textarea></textarea>
</div>
<div v=else>
        <div></div>
</div>

 

  • v-for

这个用于对数组元素的遍历,举个例子: 

<ul id="demo">
    <li
        v-for="item in items"
        class="item-{{$index}}">    <!--- $index指的是当前数组元素在数组中的位置 --->
        {{parentMessage}} - {{$index}} - {{item.message}}  <!--一个view结构-->
    </li>
</ul>
<button id="btn1">点击我</button>
<script>
    var demo= new Vue({
        el: '#demo',
        data:{
            parentMessage: 'Parent',
            items:[
                {message: 'Foo'},
                {message: 'Bar'}
            ]
        }
    })
</script>

以上代码的意思是遍历demo实例中的items数组,将里面的每一个数组元素('Foo','Bar')分别在<li>标签中显示出来

为了避免对整个列表进行渲染,经常会使用:track-by = "$index",表示只对当前数组元素进行操作。  

至此,关于Vue的最基本的东西已经介绍完,需要更多的API资料可以参考: http://cn.vuejs.org/api/

 

  • Vue文件的结构以及数据流的控制

在vue文件中,我们经常可以看到这样的格式:

<template>
       <div>  </div>
</template>

<script>
       export default{
             data(){ ...
             },
             methods:{ // 自定义方法,可对data进行处理
                   method1(){ ... } 
                   ...           
             },
             components: { ... }
             vuex: {
                   getters:{  // 获取store的数据
                        questionnaire: state => state.currentQuestionnaire 
                   }
                   actions: {  //用来分发数据容器store中mutations方法
                       action1(){ dispatch("SET_QUEST", item) }  // dispatch用来调用父组件store的"SET_QUEST"方法 
                       action2(){ ... }
             }   
             directives: {
                   'my-directive': {
                        bind: function(){ //钩子函数,只调用一次,在指令第一次绑定到元素上时调用 } 
                        update: function(newValue, oldValue) { //钩子函数,在bind之后以初始值为参数第一次调用,之后每当绑定至变化时调用 }
                        unbind: function(){ //钩子函数,只调用一次,在指令从元素上解绑时调用 }
                   }
             }    
          // 自定义指令,在<template>中以<div v-my-directives = ""> 方式调用         
         }
</script>

<style>   </style>

  

<template>中放置的是这个页面(或者页面的一部分)所拥有的控件,而<script>中定义的是Vue的数据对象和方法,<style>中定义的是控件的css样式。

在methods中经常使用到“this”关键字,该关键字指向Vue组件实例。

event.target: 触发事件的具体控件,不产生冒泡作用,是谁就是谁,这个在锁定事件触发的控件时经常用到,比如:

<div @click.stop = "addItem($event)">
     <span data-type = "radio">单选题</span>
     <span data-type = "checkbox">多选题</span>
     <span data-type =  "textarea">文本题</span>
</div>

<script>
      export default{
            method: {
                    addItem(event){
                         let target = event.target
                         if(target.nodeName.toLowerCase() === 'span') {  // 当点击了选择的按钮后
                                this.showMask = true    // 显示弹出框
                                this.questItem.type = target.dataset.type   // 设置问题的类型
                         }
            }
     }
</script>

最后讲讲this.$els: 一个对象,包含注册有v-el的DOM元素

<div class = "promt-header">
    <div>
          <label> 问题名称: </label>
          <input type = "text", placeholder = "请输入标题" v-el: item-title/>
    </div>
</div>
<div class = "promt-footer" @click.stop = "handleInput(&event)">
     <button type = "button" data-operation = "confirm"> 确定 </button>
     <button type = "button" data-operation = "cancel"> 取消 </button>
</div>

<script>
      methods: {
                handleInput(event) {
                    let target = event.target
                    if(target.nodeName.toLowerCase() !== 'button') {
                        return
                    }
                    let itemTitle = this.$els.itemTitle
                    let itemSelections = this.$els.itemSelections
                    if(target.dataset.operation === "confirm") {
                        if(this.questItem.type === "textarea") {
                            this.addTextarea(itemTitle)
                        } else {
                            this.addSelections(itemTitle, itemSelections)
                        }
                    } else {
                        this.handleCancel()
                    }
               },
      }
</script>

上面的代码是不完整的,但是可以看到,v-el把该控件挂载在一个名字为"item-title"的实体中,我们可以通过this.$els.itemTitle将其提取出来

要使用该控件的属性值(输入值),可以这样:

this.$els.itemTitle.value

  

  

 

 

  

 

java内部类学习笔记

这是我学习Java内部类的笔记1.为什么使用内部类?使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响1.1.使用内部类最大... 查看详情

VueJS 组件:具有 vue-class-component 的单独文件的代码覆盖率

...发布时间】:2020-02-2917:12:52【问题描述】:我正在尝试为使用vue-class-component装饰器以TypeScript编写的VueJS组件生成代码覆盖率,并为组件的实际逻辑使用单独的.t 查看详情

在 Vue js 中动态使用多个页面(组件)

】在Vuejs中动态使用多个页面(组件)【英文标题】:Usingmultiplepages(components)dynamicallyinVuejs【发布时间】:2019-04-1502:03:04【问题描述】:我正在使用LaravelNova自定义工具,它使用vuejs来实现自定义功能。创建后组件内部有一个tool.v... 查看详情

在使用 vuejs 计算的内部翻译

】在使用vuejs计算的内部翻译【英文标题】:Translateinsideacomputedwithvuejs【发布时间】:2022-01-2206:26:20【问题描述】:我想翻译这段代码中的状态:computed:variant()if(status===this.$t("vue.pending")||this.$t("vue.not_contract"))return"warning";elseif(stat... 查看详情

核心线程池的内部实现(读书笔记)

...来创建的线程有着完全不同的功能特点,但其内部实现均使用了ThreadPoolExecutor实现,下面给出了三个线程池的实现方式.publicstaticExecutorServi 查看详情

vuejs使用笔记

html:  <scriptsrc=‘vue.js‘></script>  <divid=‘app‘>    <span>{{msg}}</span>    <input type=‘text‘v-model=‘msg2‘/>    <input type=‘button‘v-on:click=‘on 查看详情

vuejs之componentslot插槽详解(代码片段)

...量如Math, Date之类外无法访问用户自定义的变量,所以使用component写组件或嵌套组件时明白变量的访问非常重要编译作用域在看componnent的使用之前,来看下component编译作用域,明白作用域范围才能顺利写出想要的组件假设我... 查看详情

java复习笔记8--内部类

Java内部类在《Thinkinjava》中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。接口只是解决了部分问... 查看详情

vue源码阅读笔记,持续更新(代码片段)

/ / Vue.jsv2.1.3源码阅读记录使用的文件为使用es2015的本地文件2018年4月20日14:06:30*/第一章,Vuejs的整体架构1.入口入口处使用一个闭包(function(global,factory)factory())(this,factory);其中factory是工厂的意思,它的内部实现是一个工... 查看详情

vue-router学习笔记

...时(第一次访问该路径后,第二次起),组件实例被重复使用,会导致vue的生命周期钩子不生效。可使用watch检测路径的参数:constUser=template:\'...\',created()this.$watch(()=>this.$route.params,(toParams,previousParams)=>//对路由变化做出响应... 查看详情

java复习笔记4--实现多重继承

实现多重继承接口内部类上面使用接口实现多重继承是一种比较可行和普遍的方式,在介绍内部类的时候谈到内部类使的多继承的实现变得更加完美了,同时也明确了如果父类为抽象类或者具体类,那么我就仅能通过内部类来实... 查看详情

vue.js学习笔记(vuejs——组件——props数据传递)

①组件实例的作用域:是孤立的,简单的来说,组件和组件之间,即使有同名属性,值也不共享。<divid="app"><add></add><del></del></div><script>varvm=newVue({el:‘#app‘,components:{"add":{template:"<button> 查看详情

vuejs使用笔记---框架

这两天学了vuejs的模板,于此纪录一下。这是整个大文件夹的配置,现在我们看到的所有文件都不需要去管,说要关注也只需要关注“index.html”"index.html"里面是这样的:<!DOCTYPEhtml><html><head><metacharset="utf-8">... 查看详情

VueJs 如何从 Vue.component 获取数据

】VueJs如何从Vue.component获取数据【英文标题】:VueJshowtogetdatafromVue.component【发布时间】:2017-09-2610:06:37【问题描述】:我想知道如何从Vue.component获取数据并发送到这个>>varapp=newVue()Vue.component(\'my-form\',template:\'#my-form\',props:[\... 查看详情

5.6-全栈java笔记:内部类的四种实现方式

...员。 但外部类不能访问内部类的内部属性。内部类的使用场合由于内部类提供了更好的封装特性,并且可以很方便的访 查看详情

VueJS:仅在计算内部未定义变量

...【发布时间】:2018-10-1923:28:54【问题描述】:我正在尝试使用Vue、Nuxt、Axios和Buefy进行异步自动完成输入。它基本上可以工作,但是当用户刚开始输入并且没有任何内容可显示时,以及没有找到此类请求时,我需要使用不同的字... 查看详情

在 Vuejs 中使用 async-await 等待函数内部的赋值

】在Vuejs中使用async-await等待函数内部的赋值【英文标题】:usingasync-awaittowaitforanassignmentinsideafunctioninVuejs【发布时间】:2020-06-1202:08:06【问题描述】:我有一个功能可以做两件事。我想等待第一行,然后执行第二行。第一行是一... 查看详情

tji读书笔记14-闭包与回调

...ze:10pt;} TJI读书笔记14-闭包与回调闭包与回调为什么要使用内部类?内部类继承自某个类或者实现某个接口,内部类的代码可以操作外嵌类的对象.这不是使用内部类的理由.那么为什么使用内部类呢?我觉得如果使用其他办法可以... 查看详情