• 基础五、表单输入绑定和组件基础


    在上一节中写了条件,列表渲染和事件的绑定,vue的事件绑定结合修饰符的使用,相比Jquery时代,极大的简化了事件相关的操作。下面继续来看vue的表单输入绑定和组件基础,也是vue基础内容的最后一节。

    一、表单输入绑定

    用 v-model 指令在表单 <input><textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件来更新数据,并在某种极端场景下进行一些特殊处理。

    v-model 会忽略所有表单元素的 valuecheckedselected attribute 的初始值而总是将当前活动实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。v-model 在内部为不同的输入元素使用不同的 property 并抛出不同的事件:

    • text 和 textarea 元素使用 value property 和 input 事件;
    • checkbox 和 radio 使用 checked property 和 change 事件;
    • select 字段将 value 作为 prop 并将 change 作为事件。

    多个复选框,绑定到同一个数组:

     1 <div id="v-model-multiple-checkboxes">
     2   <input type="checkbox" id="jack" value="Jack" v-model="checkedNames" />
     3   <label for="jack">Jack</label>
     4   <input type="checkbox" id="john" value="John" v-model="checkedNames" />
     5   <label for="john">John</label>
     6   <input type="checkbox" id="mike" value="Mike" v-model="checkedNames" />
     7   <label for="mike">Mike</label>
     8   <br />
     9   <span>Checked names: {{ checkedNames }}</span>
    10 </div>

     在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步。你可以添加 lazy 修饰符,从而转为在 change 事件_之后_进行同步:

    1 <!-- 在“change”时而非“input”时更新 -->
    2 <input v-model.lazy="msg" />

    .number:自动将用户的输入值转为数值类型,可以给 v-model 添加 number。

    .trim:自动过滤用户输入的首尾空白字符。

    二、组件基础

     组件是带有名称的可复用实例。看一个组合示例: 

    1 <template>
    2   <li>{{ todo.text }}</li>
    3 </template>
    4 <script>
    5 export default {
    6   name: "todo-item",
    7   props: ["todo"],
    8 };
    9 </script>

     因为组件是可复用的组件实例,所以它们与根实例接收相同的选项,例如 datacomputedwatchmethods 以及生命周期钩子等。可以将组件进行任意次数的复用:

     1 <template>
     2   <div>
     3     <ol>
     4       <todo-item v-for="item in list" v-bind:todo="item" v-bind:key="item.id"></todo-item>
     5       <todo-item v-for="item in list" v-bind:todo="item" v-bind:key="item.id"></todo-item>
     6       <todo-item v-for="item in list" v-bind:todo="item" v-bind:key="item.id"></todo-item>
     7       <todo-item v-for="item in list" v-bind:todo="item" v-bind:key="item.id"></todo-item>
     8     </ol>
     9   </div>
    10 </template>
    11 <script>
    12 import TodoItem from "./TodoItem.vue";
    13 export default {
    14   name: "Test",
    15   components: {
    16     TodoItem,
    17   },
    18   data() {
    19     return {
    20       message: "safsadf",
    21       list: [
    22         { id: 0, text: "Vegetables" },
    23         { id: 1, text: "Cheese" },
    24         { id: 2, text: "Whatever else humans are supposed to eat" },
    25       ],
    26     };
    27   }
    28 };
    29 </script>

     注意当循环遍历时,每个组件都会各自独立维护它的 item。因为你每用一次组件,就会有一个它的新实例被创建。

    通常一个应用会以一棵嵌套的组件树的形式来组织。例如,你可能会有页头、侧边栏、内容区等组件,每个组件又包含了其它的像导航链接、博文之类的组件。为了能在模板中使用,这些组件必须先注册以便 Vue 能够识别。这里有两种组件的注册类型:全局注册和局部注册。

    Prop 是你可以在组件上注册的一些自定义 attribute。如上面的 props: ["todo"]。当一个值被传递给一个 prop attribute 时,它就成为该组件实例中的一个 property。该 property 的值可以在模板中访问,就像任何其他组件 property 一样。一个组件默认可以拥有任意数量的 prop,无论任何值都可以传递给 prop。

    监听子组件事件

     一些功能可能需要与父级组件进行沟通。例如我们可能会引入一个辅助功能来放大博文的字号,同时让页面的其它部分保持默认的字号: 

     1 <template>
     2   <li :style="{fontSize:size+'em'}">{{ todo.text }} <button @click="$emit('enlargeText')">放大字体</button></li>
     3 </template>
     4 <script>
     5 export default {
     6   name: "todo-item",
     7   props: ["todo",'size'],
     8   emits:['enlargeText']
     9 };
    10 </script>

     从示例中,通过添加一个按钮,再通过$emit定义一个事件 enlargeText 暴露出去,在引用的地方进行调用。同时再定义一个变量 size ,供外部传值:

     1 <template>
     2   <div>
     3     <ol>
     4       <todo-item
     5         v-for="item in list"
     6         :todo="item"
     7         :key="item.id"
     8         :size="size"
     9         @enlargeText="onEnlargeText"
    10       ></todo-item>
    11     </ol>
    12   </div>
    13 </template>
    14 <script>
    15 import TodoItem from "./TodoItem.vue";
    16 export default {
    17   name: "Test",
    18   components: {
    19     TodoItem,
    20   },
    21   data() {
    22     return {
    23       message: "safsadf",
    24       size: 1,
    25       list: [
    26         { id: 0, text: "Vegetables" },
    27         { id: 1, text: "Cheese" },
    28         { id: 2, text: "Whatever else humans are supposed to eat" },
    29       ],
    30     };
    31   },
    32   methods: {
    33     onEnlargeText() {
    34       this.size += 1;
    35     },
    36   },
    37 };
    38 </script>
    View Code

    动态组件

    有的时候,在不同组件之间进行动态切换是非常有用的,比如在一个多标签的界面里。

    1 <!-- 组件会在 `currentTabComponent` 改变时改变 -->
    2 <component :is="currentTabComponent"></component>

     其中currentTabComponent 是计算属性,component 相当于是一个占位符,currentTabComponent 计算出哪个组件名,DOM就会展现哪个组件。

    有些 HTML 元素,诸如 <ul><ol><table> 和 <select>,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如 <li><tr> 和 <option>,只能出现在其它某些特定的元素内部。比如以下示例:

    1 <!-- 这样会报错 -->
    2 <table>
    3   <blog-post-row></blog-post-row>
    4 </table>
    5 
    6 <!-- 可以这样解决 -->
    7 <table>
    8   <tr v-is="'blog-post-row'"></tr>
    9 </table>

     v-is 值应为 JavaScript 字符串文本

  • 相关阅读:
    python(4):Python应用场景
    python(3):python的优缺点
    MySQL(17):用户登录实例
    MySQL(16):参数化、封装
    MySQL(15):与python交互的增删改查
    MySQL(14):与python交互的类型
    MySQL(13):索引
    c++ --程序编译
    c++ -- 顺序容器操作
    c++ --string操作
  • 原文地址:https://www.cnblogs.com/EastWind/p/14602132.html
Copyright © 2020-2023  润新知