• Vue-基础中的基础-学习笔记


    参考资料:
    Vue官方文档教程:https://cn.vuejs.org/v2/guide/installation.html

    我现在做的工作的前端部分用到了Vue,但基本只是用一下Element UI,我也感觉Element UI框架很适合做一些xxx管理系统之类的东西。我不会前端,不会JavaScript和Vue,所以浅浅地学习一些基础知识,以便快速加入工作项目的开发。但我本人并不是很喜欢Vue。

    Element UI

    这种前端UI框架一般由专业前端开发人员来做,我可能只需要看懂就可以了,需要改代码的时候可以查文档:https://element.eleme.cn/#/zh-CN/component/installation

    声明式渲染

    大部分内容都可以在官方文档中找到,官方的介绍入门教程非常简短但全面。我这里记录几处东西用来方便自己速查。

    javascript代码:
    
    var app = new Vue({
      el: '#app',
      data: {
        message: 'Hello Vue!'
      }
    })
    
    HTML代码:
    
    <div id="app">
      {{ message }}
    </div>
    

    可以注意到new的Vue对象中的el属性的值对应着相应HTML代码的标签的id属性。双大括号可以将Vue对象中data下的属性输出出来,这种方式叫做文本插值。

    还有另外一种方式叫元素绑定:

    javascript代码:
    
    var app2 = new Vue({
      el: '#app-2',
      data: {
        message: '页面加载于 ' + new Date().toLocaleString()
      }
    })
    
    HTML代码:
    
    <div id="app-2">
      <span v-bind:title="message">
        鼠标悬停几秒钟查看此处动态绑定的提示信息!
      </span>
    </div>
    

    使用了v-bind指令,将这个span标签的title attribute与message property绑定在一起。attribute和property都可以翻译为属性,我自己把attribute理解为标签的属性,property理解为Vue示例的data下的属性。

    条件与循环

    控制一个元素是否显示:

    javascript代码:
    
    var app3 = new Vue({
      el: '#app-3',
      data: {
        seen: true
      }
    })
    
    HTML代码:
    
    <div id="app-3">
      <p v-if="seen">现在你看到我了</p>
    </div>
    

    使用了v-if指令,如果seen property的值为false,则不显示。

    我们不仅可以把数据绑定到 DOM 文本或 attribute,还可以绑定到 DOM 结构。此外,Vue 也提供一个强大的过渡效果系统,可以在 Vue 插入/更新/移除元素时自动应用过渡效果。 ——官方文档

    v-for指令可以绑定数组的数据来渲染一个项目列表:

    javascript代码:
    
    var app4 = new Vue({
      el: '#app-4',
      data: {
        todos: [
          { text: '学习 JavaScript' },
          { text: '学习 Vue' },
          { text: '整个牛项目' }
        ]
      }
    })
    
    HTML代码:
    
    <div id="app-4">
      <ol>
        <li v-for="todo in todos">
          {{ todo.text }}
        </li>
      </ol>
    </div>
    

    效果如下:

    UTOOLS1593661484315.png

    处理用户输入

    表单输入和应用状态之间双向绑定指令v-model:

    JavaScript代码:
    
    var app6 = new Vue({
      el: '#app-6',
      data: {
        message: 'Hello Vue!'
      }
    })
    
    HTML代码:
    
    <div id="app-6">
      <p>{{ message }}</p>
      <input v-model="message">
    </div>
    

    这个代码会出现一个input输入框,如果改动输入框中的文本,实际就是直接改动message的值,上面p标签展示的message的值也会随之改动。

    事件监听器指令v-on,可以通过它调用在 Vue 实例中定义的method:

    JavaScript代码:
    
    var app5 = new Vue({
      el: '#app-5',
      data: {
        message: 'Hello Vue.js!'
      },
      methods: {
        reverseMessage: function () {
          this.message = this.message.split('').reverse().join('')
        }
      }
    })
    
    HTML代码:
    
    <div id="app-5">
      <p>{{ message }}</p>
      <button v-on:click="reverseMessage">反转消息</button>
    </div>
    

    在 reverseMessage 方法中,我们更新了应用的状态,但没有触碰 DOM——所有的 DOM 操作都由 Vue 来处理,你编写的代码只需要关注逻辑层面即可。(来自文档)

    可以看到我们的Vue实例中出现了第三个属性methods,我把它理解为写一些方法的地方。可以向上边一样用v-on:click把一个button等标签的click事件绑定上methods: {}中的方法,每次点击这个button就会调用这个方法。

    组件化应用构建

    这部分我几乎用不到,我工作中基本不会复用组件,也就没必要创建一个组件。官方文档:https://cn.vuejs.org/v2/guide/index.html#组件化应用构建

    生命周期

    官方文档:https://cn.vuejs.org/v2/guide/instance.html#生命周期图示

    这个东西理解起来需要经验,可以慢慢来。

    计算属性和侦听器

    有时候在HTML模板中展示的数据会做一些逻辑处理:

    <div id="example">
      {{ message.split('').reverse().join('') }}
    </div>
    

    这种直接在模板中放入逻辑的方式会让模板过重且难以维护,我们可以使用计算属性(computed: {}):

    JavaScript代码:
    
    var vm = new Vue({
      el: '#example',
      data: {
        message: 'Hello'
      },
      computed: {
        // 计算属性的 getter
        reversedMessage: function () {
          // `this` 指向 vm 实例
          return this.message.split('').reverse().join('')
        }
      }
    })
    

    实现翻转功能的方法放到一个匿名函数里,用作 property vm.reversedMessage 的 getter 函数:

    HTML代码:
    
    <div id="example">
      <p>Original message: "{{ message }}"</p>
      <p>Computed reversed message: "{{ reversedMessage }}"</p>
    </div>
    

    Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性watch: {}。当有一些数据需要随着其它数据变动而变动时很容易滥用 watch。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。

    但有时候我们可能有监听一段内容是否被改变的需求,如果被改变,就调用一些函数。

    HTML代码:
    
    <div id="watch-example">
      <p>
        Ask a yes/no question:
        <input v-model="question">
      </p>
      <p>{{ answer }}</p>
    </div>
    
    JavaScript代码:
    
    <script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>
    <script>
    var watchExampleVM = new Vue({
      el: '#watch-example',
      data: {
        question: '',
        answer: 'I cannot give you an answer until you ask a question!'
      },
      watch: {
        // 如果 `question` 发生改变,这个函数就会运行
        question: function (newQuestion, oldQuestion) {
          this.answer = 'Waiting for you to stop typing...'
          this.debouncedGetAnswer()
        }
      },
      created: function () {
        // `_.debounce` 是一个通过 Lodash 限制操作频率的函数。
        // 在这个例子中,我们希望限制访问 yesno.wtf/api 的频率
        // AJAX 请求直到用户输入完毕才会发出。想要了解更多关于
        // `_.debounce` 函数 (及其近亲 `_.throttle`) 的知识,
        // 请参考:https://lodash.com/docs#debounce
        this.debouncedGetAnswer = _.debounce(this.getAnswer, 500)
      },
      methods: {
        getAnswer: function () {
          if (this.question.indexOf('?') === -1) {
            this.answer = 'Questions usually contain a question mark. ;-)'
            return
          }
          this.answer = 'Thinking...'
          var vm = this
          axios.get('https://yesno.wtf/api')
            .then(function (response) {
              vm.answer = _.capitalize(response.data.answer)
            })
            .catch(function (error) {
              vm.answer = 'Error! Could not reach the API. ' + error
            })
        }
      }
    })
    </script>
    

    使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。除了 watch 选项之外,还可以使用命令式的 vm.$watch API。

    <template> 元素

    <template>这个元素像是个对页面没什么影响的标签,有时常结合 v-if 和 v-for 使用。

    v-if,v-show,v-else,v-else-if与key

    v-show 用法跟 v-if 差不多,区别是 v-if 只有条件为真时才开始渲染,v-show 却始终在DOM中,当条件为真时就显示出来。

    可以使用 v-else 指令来表示 v-if 的 else 块,v-else-if 充当 v-if 的 else-if 块,可以连续使用。

    <div v-if="type === 'A'">
      A
    </div>
    <div v-else-if="type === 'B'">
      B
    </div>
    <div v-else-if="type === 'C'">
      C
    </div>
    <div v-else>
      Not A/B/C
    </div>
    

    key的部分我觉得官方文档的例子非常好,我直接搬过来:
    https://cn.vuejs.org/v2/guide/conditional.html#用-key-管理可复用的元素

    Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做除了使 Vue 变得非常快之外,还有其它一些好处。例如,如果你允许用户在不同的登录方式之间切换:

    <template v-if="loginType === 'username'">
      <label>Username</label>
      <input placeholder="Enter your username">
    </template>
    <template v-else>
      <label>Email</label>
      <input placeholder="Enter your email address">
    </template>
    

    那么在上面的代码中切换 loginType 将不会清除用户已经输入的内容。因为两个模板使用了相同的元素,<input> 不会被替换掉——仅仅是替换了它的 placeholder。

    如果设计一个按按钮,点击一下按钮,输入框就从 Username 的输入框变成 Email 的输入框,但内容并没有变化。

    这样也不总是符合实际需求,所以 Vue 为你提供了一种方式来表达“这两个元素是完全独立的,不要复用它们”。只需添加一个具有唯一值的 key attribute 即可:

    <template v-if="loginType === 'username'">
      <label>Username</label>
      <input placeholder="Enter your username" key="username-input">
    </template>
    <template v-else>
      <label>Email</label>
      <input placeholder="Enter your email address" key="email-input">
    </template>
    

    现在,每次切换时,输入框都将被重新渲染,内容就重新为空,只显示占位字符串。<label> 元素仍然会被高效地复用,因为它们没有添加 key attribute。

    官方文档不推荐同时使用v-if 与 v-for。但当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级

    列表渲染

    这部分很简单,用的也很多。可以直接看官方文档:
    https://cn.vuejs.org/v2/guide/list.html

    一般都是把需要展示的列表内容取到,映射到一个对象里,把这个对象放在data中。在前端用 v-for 遍历这个对象,不要忘记加一个key,方便Vue跟踪每个节点的身份。

    数组更新检测(这一部分感觉做分页功能的时候用得到):
    https://cn.vuejs.org/v2/guide/list.html#数组更新检测

    事件处理

    可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码:

    <div id="example-1">
      <button v-on:click="counter += 1">Add 1</button>
      <p>The button above has been clicked {{ counter }} times.</p>
    </div>
    
    var example1 = new Vue({
      el: '#example-1',
      data: {
        counter: 0
      }
    })
    

    一般不直接写v-on:click="counter += 1"这种代码,而是绑定到一个方法,也可以在内联 JavaScript 语句中调用方法。

    <div id="example-3">
      <button v-on:click="say('hi')">Say hi</button>
      <button v-on:click="say('what')">Say what</button>
    </div>
    
    new Vue({
      el: '#example-3',
      methods: {
        say: function (message) {
          alert(message)
        }
      }
    })
    

    事件修饰符:https://cn.vuejs.org/v2/guide/events.html#事件修饰符

    按键修饰符:https://cn.vuejs.org/v2/guide/events.html#按键修饰符

    表单输入绑定

    这一部分可能常用,重点关注:https://cn.vuejs.org/v2/guide/forms.html

    v-bind和v-model的区别

    https://segmentfault.com/a/1190000014813168?utm_source=tag-newest
    这篇文章写得比较好,可以看一下。

  • 相关阅读:
    WCF 、Web API 、 WCF REST 和 Web Service 的区别
    BusyIndicator using MVVM 忙碌状态指示器的的实现
    复制文件夹的方法 .net
    SQL/LINQ/Lamda
    CSLA验证规则总结
    C++中GB2312字符串和UTF-8之间的转换
    如何用VC编写供PB调用的DLL
    【转】lucene4.3.0 配置与调试
    cygwin主要命令
    【转】eclipse中window->preference选项中没有tomcat的解决方法
  • 原文地址:https://www.cnblogs.com/Kit-L/p/13227111.html
Copyright © 2020-2023  润新知