Vue.js 入门

作者: Better_cn | 来源:发表于2018-03-29 21:35 被阅读0次

    简介

    • Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架。

    • Vue 只关注视图层, 采用自底向上增量开发的设计。

    • Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    安装

    BootCDN(国内)

    <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
    

    unpkg

    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
    

    cdnjs

    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js"></script>
    
    • NPM 方法
    npm install vue
    

    命令行工具 vue-cli

    Vue.js 提供一个官方命令行工具,可用于快速搭建大型单页应用。

    # 全局安装 vue-cli
    $ cnpm install --global vue-cli
    # 创建一个基于 webpack 模板的新项目
    $ vue init webpack my-project
    # 这里需要进行一些配置,默认回车即可
    
    
    ? Project name my-project
    ? Project description A Vue.js project
    ? Author BetterCN <13739485933@163.com>
    ? Vue build standalone
    ? Install vue-router? Yes
    ? Use ESLint to lint your code? Yes
    ? Pick an ESLint preset Standard
    ? Set up unit tests Yes
    ? Pick a test runner jest
    ? Setup e2e tests with Nightwatch? Yes
    ? Should we run `npm install` for you after the project has been created? (recommended) npm
    
       vue-cli · Generated "my-project".
    
    
    # Installing project dependencies ...
    # ========================
    

    进入项目,安装并运行:

    $ cd my-project
    $ npm install
    $ npm run dev
    
    > my-project@1.0.0 dev /Users/better_cn/Myproject/my-project
    > webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
    
     95% emitting
    
     DONE  Compiled successfully in 2998ms                                                                                                                                    14:33:29
    
     I  Your application is running here: http://localhost:8080
    
    > Listening at http://localhost:8080
    

    打开localhost:8080

    知识点

    vue实例:

    new Vue({
      el: '#app',
      components: { App },
      template: '<App/>'
    })
    

    选项API:
    https://cn.vuejs.org/v2/api/#components

    组件化应用构建

    声明式渲染

    Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统:

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

    指令邦定

    <div id="app-2">
      <span v-bind:title="message">
        鼠标悬停几秒钟查看此处动态绑定的提示信息!
      </span>
    </div>
    

    指令
    指令 (Directives) 是带有 v- 前缀的特殊属性
    v-bind:

    <!-- 完整语法 -->
    <a v-bind:href="url">...</a>
    
    <!-- 缩写 -->
    <a :href="url">...</a>
    

    v-on:

    <!-- 完整语法 -->
    <a v-on:click="doSomething">...</a>
    
    <!-- 缩写 -->
    <a @click="doSomething">...</a>
    

    v-if

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

    v-for:

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

    v-model:

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

    数据,方法,计算属性,侦听器

    <div id="example">
      <p>Original message: "{{ message }}"</p>
      <p>Computed reversed message: "{{ reversedMessage }}"</p>
      <p>Computed reversed message: "{{ reversedMessage()}}"</p>
    </div>
    var vm = new Vue({
      el: '#example',
      data: {
        message: 'Hello'
      },
      methods: {
      reversedMessage: function () {
        return this.message.split('').reverse().join('')
        }
      },
      computed: {
        reversedMessage: function () {
          return this.message.split('').reverse().join('')
        }
      },
      watch: {
        // 如果 `message` 发生改变,这个函数就会运行
          message: function (newMessage, oldMessage) {
            ...
        }
    })
    

    生命周期

    var vm = new Vue({
        el: "#container",
        data: {
            test : 'hello world'
        },
        beforeCreate: function(){
            console.log(this);
            showData('创建vue实例前',this);
        },
        created: function(){
            showData('创建vue实例后',this);
        },
        beforeMount:function(){
            showData('挂载到dom前',this);
        },
        mounted: function(){
            showData('挂载到dom后',this);
        },
        beforeUpdate:function(){
            showData('数据变化更新前',this);
        },
        updated:function(){
            showData('数据变化更新后',this);
        },
        beforeDestroy:function(){
            vm.test ="3333";
            showData('vue实例销毁前',this);
        },
        destroyed:function(){
            showData('vue实例销毁后',this);
        }
    
    });
    

    组件
    全局注册

    <div id="example">
      <my-component></my-component>
    </div>
    
    // 注册
    Vue.component('my-component', {
      template: '<div>A custom component!</div>'
    })
    
    // 创建根实例
    new Vue({
      el: '#example'
    })
    

    局部注册

    var Child = {
      template: '<div>A custom component!</div>'
    }
    
    new Vue({
      // ...
      components: {
        // <my-component> 将只在父组件模板中可用
        'my-component': Child
      }
    })
    

    组件组合
    组件 A 在它的模板中使用了组件 B。它们之间必然需要相互通信:父组件可能要给子组件下发数据,子组件则可能要将它内部发生的事情告知父组件。

    prop 向下传递,事件向上传递


    image

    子组件要显式地用 props 选项声明它预期的数据:

    Vue.component('child', {
      // 声明 props
      props: ['my-message'],
      // 就像 data 一样,prop 也可以在模板中使用
      // 同样也可以在 vm 实例中通过 this.message 来使用
      template: '<span>{{ my-message }}</span>'
    })
    
    <child message="hello!"></child>
    



    动态邦定prop

    <div id="prop-example-2">
      <input v-model="parentMsg">
      <br>
      <child v-bind:my-message="parentMsg"></child>
    </div>
    new Vue({
      el: '#prop-example-2',
      data: {
        parentMsg: 'Message from parent'
      }
    })
    



    单项数据流
    Prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是反过来不会。这是为了防止子组件无意间修改了父组件的状态,来避免应用的数据流变得难以理解。

    注意在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态。

    自定义事件
    每个 Vue 实例都实现了事件接口,即:

    • 使用 $on(eventName) 监听事件
    • 使用 $emit(eventName, optionalPayload) 触发事件

    父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。

    <div id="counter-event-example">
      <p>{{ total }}</p>
      <button-counter v-on:increment="incrementTotal"></button-counter>
      <button-counter v-on:increment="incrementTotal"></button-counter>
    </div>
    
    Vue.component('button-counter', {
      template: '<button v-on:click="incrementCounter">{{ counter }}</button>',
      data: function () {
        return {
          counter: 0
        }
      },
      methods: {
        incrementCounter: function () {
          this.counter += 1
          this.$emit('increment')
        }
      },
    })
    
    new Vue({
      el: '#counter-event-example',
      data: {
        total: 0
      },
      methods: {
        incrementTotal: function () {
          this.total += 1
        }
      }
    })
    

    这里有一个如何使用载荷 (payload) 数据的示例:

    <div id="message-event-example" class="demo">
      <p v-for="msg in messages">{{ msg }}</p>
      <button-message v-on:message="handleMessage"></button-message>
    </div>
    
    Vue.component('button-message', {
      template: `<div>
        <input type="text" v-model="message" />
        <button v-on:click="handleSendMessage">Send</button>
      </div>`,
      data: function () {
        return {
          message: 'test message'
        }
      },
      methods: {
        handleSendMessage: function () {
          this.$emit('message', { message: this.message })
        }
      }
    })
    
    new Vue({
      el: '#message-event-example',
      data: {
        messages: []
      },
      methods: {
        handleMessage: function (payload) {
          this.messages.push(payload.message)
        }
      }
    })
    

    vue-router::https://router.vuejs.org/zh-cn/

    官方支持的 vue-router 库

    vux:https://vuex.vuejs.org/zh-cn/intro.html

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

    Vue.js 服务器端渲染:https://ssr.vuejs.org/zh/

    Vue.js 是构建客户端应用程序的框架。默认情况下,可以在浏览器中输出 Vue 组件,进行生成 DOM 和操作 DOM。然而,也可以将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序。

    相关文章

      网友评论

        本文标题:Vue.js 入门

        本文链接:https://www.haomeiwen.com/subject/ccapfftx.html