美文网首页
Vue 入门2 基础篇

Vue 入门2 基础篇

作者: 老奶瓶 | 来源:发表于2020-06-22 14:25 被阅读0次

    [TOC]

    Vue.js 基础部分包括

    • Vue.js的组成 (template, script,style)
    • 模板语法(文本属性)、渲染条件v-if 、列表渲染v-for
    • 事件处理v-on (@简写)、计算属性computed

    Vue.js 核心组件

    • 路由组件 vue-router
    • 单项数据流 状态管理Vuex

    Vue.js 基础

    模板语法

    Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。

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

    结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。

    所有语言的模版语法,基本上都是在追求:让你你用个大括号{{data}}就可以把数据展示在页面上。

    文本插值

    <div class="home">{{msg}}</div>
    <script>
    export default {
      name: 'home',
      data () {
        return {
          msg: 'hello world'
        }
      }
    }
    </script>
    

    条件语句 v -if

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

    这里, v-if 指令将根据表达式 seen 的值(true 或 false )来决定是否插入 p 元素,

    为true时插入。

    可以用 v-else 指令给 v-if 添加一个 "else" 块,跟if 块的逻辑相反。

    我们也可以用 v-show 语句展示隐藏元素。

    <h1 v-show="seen">Hello!</h1>
    
    • 相同点:v-if与v-show都可以动态控制dom元素显示隐藏

    • 不同点:v-if显示隐藏是将dom元素整个添加或删除,而v-show隐藏则是为该元素添加css--display:none,dom元素还在。

    表单form-双向事件绑定v-model

    你可以用 v-model 指令在表单控件元素上创建双向数据绑定

    这样输入的数据和data的数据可以同时,动态的更新。

    20151109171527_549
      <form v-if="isShow">
            <div class="item">
              菜品名称
              <input type="text" v-model="unit.name" />
            </div>
            
      </form>
     
    <script>
    export default {
      data () {
        return {
          msg: 'hello world',
          isShow: true,
          unit: {
            name: ''
          }
        }
      }
    </script>
    

    复选框双向绑定

    <div id="app">
      <p>单个复选框:</p>
      <input type="checkbox" id="checkbox" v-model="checked">
      <label for="checkbox">{{ checked }}</label>
        
      <p>多个复选框:</p>
      <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
      <label for="runoob">Runoob</label>
      <input type="checkbox" id="google" value="Google" v-model="checkedNames">
      <label for="google">Google</label>
      <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
      <label for="taobao">taobao</label>
      <br>
      <span>选择的值为: {{ checkedNames }}</span>
    </div>
    
    <script>
    new Vue({
      el: '#app',
      data: {
        checked : false,
        checkedNames: []
      }
    })
    </script>
    </body>
    

    核心组件

    路由

    我们需要一个vue router库,利用路由实现一个单页面应用。

    Runnoob Eg :

    <div id="app">
      <h1>Hello App!</h1>
      <p>
        <!-- 使用 router-link 组件来导航. -->
        <!-- 通过传入 `to` 属性指定链接. -->
        <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
        <router-link to="/foo">Go to Foo</router-link>
        <router-link to="/bar">Go to Bar</router-link>
      </p>
      <!-- 路由出口 -->
      <!-- 路由匹配到的组件将渲染在这里 -->
      <router-view></router-view>
    </div>
    
    

    Js

    // 0. 如果使用模块化机制编程,导入 Vue 和 VueRouter,要调用 Vue.use(VueRouter)
     
    // 1. 定义(路由)组件。
    // 可以从其他文件 import 进来
    const Foo = { template: '<div>foo</div>' }
    const Bar = { template: '<div>bar</div>' }
     
    // 2. 定义路由
    // 每个路由应该映射一个组件。 其中"component" 可以是
    // 通过 Vue.extend() 创建的组件构造器,
    // 或者,只是一个组件配置对象。
    // 我们晚点再讨论嵌套路由。
    const routes = [
      { path: '/foo', component: Foo },
      { path: '/bar', component: Bar }
    ]
     
    // 3. 创建 router 实例,然后传 `routes` 配置
    // 你还可以传别的配置参数, 不过先这么简单着吧。
    const router = new VueRouter({
      routes // (缩写)相当于 routes: routes
    })
     
    // 4. 创建和挂载根实例。
    // 记得要通过 router 配置参数注入路由,
    // 从而让整个应用都有路由功能
    const app = new Vue({
      router
    }).$mount('#app')
     
    // 现在,应用已经启动了!
    

    Vue - cli项目中,我们的router路由配置文件通常在定义在 router.js或者router/index.js 文件中

    router/index.js:

    import Vue from 'vue'
    import VueRouter from 'vue-router'
    import Home from '@/views/Home.vue'
    import Order from '@/views/Order.vue'
    
    Vue.use(VueRouter)
    
    const routes = [
      {
        path: '/',
        name: 'home',
        component: Home
      },
      {
        path: '/order',
        name: 'order',
        component: Order
      }
    ]
    
    const router = new VueRouter({
      routes
    })
    
    export default router
    
    

    Main.js初始化

    import Vue from 'vue'
    import router from '@/router'
    
    Vue.config.productionTip = false
    
    new Vue({
      router,
      render: h => h(App)
    }).$mount('#app')
    

    Vuex

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式

    这个状态自管理应用包含以下几个部分:

    • state,驱动应用的数据源;
    • view,以声明方式将 state 映射到视图;
    • actions,响应在 view 上的用户输入导致的状态变化。
    vuex.png

    状态管理(组件传参)

    在vue-cli中,store文件(处理/存储/传递状态)位于store/index.js

    import Vue from 'vue'
    import Vuex from 'vuex'
    
    Vue.use(Vuex)
    export default new Vuex.Store({
      state: {
        // vuex 维护的数据
        lists: []
      },
      mutations: {
        // 组件存数据
        setList (state, value) {
          state.lists = value
        }
      }
    })
    

    在main.js中初始化

    import Vue from 'vue'
    import App from '@/App.vue'
    import store from '@/store'
    
    Vue.config.productionTip = false
    
    new Vue({
      store,
      render: h => h(App)
    }).$mount('#app')
    
    

    在组件1中用store存状态(数据)

    export default {
      mounted () {
        // 重新初始化的时候,会重新赋值,这时候通过vuex取值
        this.lists = this.$store.state.lists
      },
      methods: {
        add () {
          // 添加unit到sotre中的lists中去    
          this.$store.commit('setList', this.lists)
        }  
      }
    }
    

    在组件2从store的存储取状态(数据)

    export default {
      name: 'order',
      data () {
        return {
          // 取vuex 中的数据
          lists: this.$store.state.lists
        }
      },
      methods: {
        minus (item, index) {
          item.num--
          // vue可以监听 某个对象的变化,而不会监听某个属性的变化,所以需要用set方法
          this.$set(this.lists, index, item)
        }
        }
      }
    }
    </script>
    

    组件之间传递值

    1. 单向数据流最基本的传参方式

      在父组件中,使用component引用子组件,然后使用props属性:
      
      <child-component :property="data"></child-component>
      
    2. 组件间通信的状态管理Vuex,可以完成组件间的数据通信及状态管理。需要注意的是,vuex中的状态只能通过mutations进行改变

      使用Vuex状态管理进行父子组件通信,定义store.js,并定义state,在state中定义传递的属性比如叫childProperty。然后,在子组件中,使用store.state.childProperty进行使用。
      
    3. vue-router中组件传参https://router.vuejs.org/zh/guide/essentials/passing-props.html#%E5%B8%83%E5%B0%94%E6%A8%A1%E5%BC%8F

      使用router中的Params进行传参(即路径传参)
      
      设置路由/child/:id,当访问到/child/1元素的时候,在子组件中,使用this.$route.params.id的方式进行使用
      

    懒加载新组件

    新建组件newComponent.vue,并且在router.js中添加路由/new路径,那么创建路由后,如何配置和使用懒加载进行页面优化?

    引用组件后,使用import进行懒加载,定义webpackChunkName,

    {path: '/new', components: () => import( /*webpackChunkName: 'new'*/'@/components/newComponent')}
    
    配置了webpackChunkName,可以在router.js头部,按照如下方式进行引用:
    const NewComponent = () => import( '@/components/newComponent')
    然后配置router.js中的路由:{path: '/new', components: NewComponent}
    注意路径与单词的拼写错误问题
    

    计算属性computed

    computed和watch方法最大的区别:

    computed监视了所有的方法体内实例的属性变化。

    计算属性缓存和方法Methods的区别:

    computed是会自动触发的,是一种响应式的。

    Methods中的方法需要我们执行这个方法。

    如果data中的属性中包裹的是computed中的方法,那么data中就会获得一个被实时监控的属性。

    Lodash依赖

    https://www.lodashjs.com/

    https://www.lodashjs.com/
    

    安装 (安装到开发环境)

    npm install lodash -S
    

    Eg:

    过滤

    import _ from 'lodash'
    export default {
      mounted () {
        const aar = _.filter([1, 2, 3], (item) => item > 1)
        console.log(aar)
      }
    }
    

    Result : aar是 大于 1的数。

    (2) [2, 3] 
    0: 2
    1: 3
    length: 2
    

    Ps 插播: Eslint 格式化保存报错问题

    Eslint 格式化保存报错问题

    Vs code

    : 首选项/setting

    打开 setting.json

    修改

      "editor.formatOnSave": false,
    

    相关文章

      网友评论

          本文标题:Vue 入门2 基础篇

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