学习Vue.js Day6

145 阅读4分钟

v-model双向绑定 input textarea 修改input值时也会修改后台的值

    <input type="text" v-model="message">
    <!--  <input type="text" :value="message" @input="changeMessage">-->

v-model radio可以不用写name

    <label for="male">
        <input type="radio" id="male"  value="男" v-model="sex">男
    </label>
    <label for="female">
        <input type="radio" id="female" value="女" v-model="sex">女
    </label>

v-model checkbox多选框

label 中用for可以实现点击文字选中文本框

:disabled 绑定boolean 来确定按钮状态

 <label for="agree">
    <input type="checkbox" id="agree" v-model="isAgree">同意协议
    <button :disabled="!isAgree">下一步</button>
  </label>

select 与 v-model

v-model多选框处理时是一个数组,单选框时是布尔值 单选

    <input type="checkbox" value="篮球" v-model="hobbies">篮球
    <input type="checkbox" value="足球" v-model="hobbies">足球
    <input type="checkbox" value="桌球" v-model="hobbies">桌球
    <input type="checkbox" value="排球" v-model="hobbies">排球
    <input type="checkbox" value="羽毛球" v-model="hobbies">羽毛球
  <br>

多选

<!--  {{fruit}}-->
  <select name="abc"  v-model="fruit">
    <option value="苹果" >苹果</option>
    <option value="香蕉" >香蕉</option>
    <option value="榴莲" >榴莲</option>
    <option value="葡萄" >葡萄</option>
  </select>
  <select name="abc"  v-model="fruits" multiple>
    <option value="苹果" >苹果</option>
    <option value="香蕉" >香蕉</option>
    <option value="榴莲" >榴莲</option>
    <option value="葡萄" >葡萄</option>
  </select>
  {{fruits}}
<script src="../js/vue.js"></script>
<script>
  const app = new Vue({
    el:'#app',
    data:{
      message:'你好啊',
      sex:'男',
      isAgree: false,
      hobbies:[],
      fruit:'苹果',
      fruits:[],
    },
    methods:{
      changeMessage(event){
        this.message = event.target.value
      }
    }
  })
</script>

值绑定 动态的获得数据 v-bind

v-model的修饰符

.lazy 失去焦点或者获得回车

v-model 默认绑定的类型是字符串类型,所以若要保持number属性要加上.number

.trim 除去多余的空格

  <input type="text" v-model.trim="name">

什么是组件化?

它提供一种抽象的,让我们可以开发出一个个独立可复用的小组件来构造我们的应用。

任何的应用都会被抽象成一颗组件树

注册组件的基本步骤

  • 创建组件构造器
  • 注册组件
  • 使用组件

注意局部组件和全局组件的注册区别!!!

  • 局部组件,在vue实例下注册,并且只能在特定的实例下使用
  • 全局组件,在vue实例外面注册,可以在多个实例下使用
<div id="app">
<!--  使用组件-->
  <my-cpn></my-cpn>
</div>
<!--必须在Vue实例下才能使用-->
<my-cpn></my-cpn>
<script src="../js/vue.js"></script>
<script>
  // 全局组件,意味着可以在多个Vue实例中使用
  // 1.创建组件构造器对象
  const cpnC = Vue.extend({
    template: `
      <div>
        <h2>w</h2>
        <h2>w</h2>
        <h2>w</h2>
      </div>
    `
  })
  // 2.注册组件 全局注册
  // Vue.component('my-cpn', cpnC)
  const app = new Vue({
    el:'#app',
    data:{

    },
    components:{
      // 局部注册 局部组件
      cpn:cpnC,
    }
  })
</script>

语法糖组件注册

// 全局组件注册的语法糖
  Vue.component('cpn1', {
    template:`
    <div>
      <h2>woShiNiBa</h2>
      <h2>sbWanYi</h2>
    </div>
    `
  })

父组件和子组件的区别

注册的组件内容需要用 div包含起来

不能直接使用父组件下的子组件

模板分离 使代码更加简洁

第一种方法:使用javascript

<script type="text/x-template" id="cpn">
  <div>
    <h2>我是标题</h2>
    <p>我是内容:哈哈哈</p>
  </div>
</script>
<script>
  // 1.注册一个全局组件
  Vue.component('cpn',{
    template:`#cpn`
  })
  const app = new Vue({
    el:'#app',
    data:{

    }
  })
</script>

第二种写法使用template

<template id="cpn1">
  <div>
    <h2>我是第二种写法</h2>
    <p>我是内容:嘻嘻</p>
  </div>
</template>
<script src="../js/vue.js"></script>
<script>
  // 1.注册一个全局组件
  Vue.component('cpn',{
    template:`#cpn1`
  })
  const app = new Vue({
    el:'#app',
    data:{

    }
  })
</script>

组件可以访问Vue实例数据吗?

组件是一单独功能的封装:

这个模块有属于自己的html模板,也应该有自己的数据data

组件中的数据是保存在哪里呢?顶层的Vue实例中吗?

不能直接访问到顶层Vue实例中的data

Vue组件应该有自己保存数据的地方

组件中要使用数据的话,需要使用data函数,并返回一个对象

组件中也可以使用 methods

<div id="app">
<cpn></cpn>
</div>
<template id="cpn">
  <div>
    <h2>{{title}}</h2>
    <h2>123</h2>
  </div>
</template>
<script src="../js/vue.js"></script>
<script>
  Vue.component('cpn',{
    template:'#cpn',
    data(){
      return {
        title: 'abc',
      }
    }
  })
  const app = new Vue({
    el:'#app',
    data:{
      title:'我是标题来自父类',
    }
  })
</script>

同一组件不共享统一对象数据,则也就是为什么组件中的data为什么要使用函数,这样就会使用不同的内存地址