前端VUE笔记

           vue

杂记 脚手架

console.log()控制台打印输出和alert()差不多   

!important设置Css优先级最高

display: flex; <div style=" flex: 1;"/></div>设置水平状态下div占的宽度比

<style scoped>  设置作用域 只限于目前页面

插值

<template>写法
       <div v-once>{{su}}</div> 当标签中带v-once 时插值处的内容不会更新,但会影响其                             

他节点上的数据绑定
      <input type="button" @click="insert" value="点击">

computed:计算属性 

<template>写法 <div>age+a={{addToA}}</div>

在methods: 中 computed:{addToA:function(){   return this.age+this.a  },

data: 中 a:0,

ref数据绑定

<template> <input type="text"  ref="name"></input>
 <input type="button" @click="insert">

methods:{  insert:function () { this.b=this.$refs.name.value; }},

this.$refs.name.value;获取ref名为name的value值

    data:  function(){return{  n:'',}}}

引图片

<template> <img class="images" :src="imgSrc">

 data: imgSrc:"图片路径",

For循环 循环数组

1 <template> 页面中循环显示数组的方法

<li v-for="(item , index) in brands[brand].category[cate].skill"
    @click="chooseCategories(index)" index 要查询的数组下标

brands[brand] 数组[下标].skill数组内字段
   :class="[skillsIndex===index?'selectedShow choiceBox':'choiceBox']"
>
    {{item.skills}} 显示数组内的字段

</li>

 

2  methods:中用For循环数组内数据

for(let i in this.brands){ i是下标
    console.log(this.brands[this.brand]);
}

全局组件

  在main页面设置

Import User from ‘./components/Users’ //导包 Users是一个vue页面

Vue.component(“users”,Users) //全局注册组件  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

指令

V-text

 更新元素的textContent。如果要更新部分的textContent,需要使用{{ Mustache }} 插值。

<span v-text="msg"></span> <!-- 和下面的一样 --> <span>{{msg}}</span>

V-html

与V-text一样 只是V-text是设置文本的 V-html渲染css的

<div v-html="html"></div>     data 里面的 html:'<h1>教程</h1>',

v-if  判断文本中属性是否为确定的值,如果是就显示后面的属性,如不不是就不显示

<h1 v-if="ok">Hello</h1>

data (){ return {ok:true,}}

默认判断ok 属性是否为true 是就显示Hello 不是就显示为空

v-show

也是根据条件来展示元素的,和v-if的功能类似。但是v-show中如果条件为false就生成代码不显示。而v-if如果条件为false,就直接不生成代码。

 

v-if与 v-else   v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

 <div v-if="Math.random()>0.5">
    sorry
  </div>
  <div v-else>
    not sorry
  </div>
</div>

 

判断Math.random()>0.5 是的话就输出sorry 不是就输出 not sorry

v-else-if

<div v-if="show === 'ab'">ab</div>
<div v-else-if="show === 'b'">b</div>
<div v-else-if="show === 'c'">c</div>
<div v-else>abcde</div>

 

data (){
   return {
        show:'cb',
  }

判断字符串是否为ad 是否为b 是否为c 否则显示abcde

 

 

 

 

 

 

V-for

<template>

<div>
      <ul>
        <li v-for="todo in tods "> 或者"(todo i) in tods " 键是i 值是todo
          {{todo.txt}}
        </li>
      </ul>
    </div>
</template>

 

<script>

data (){
   return {

tods:[
  {txt:'你好'},
  {txt:'数组'},
  {txt:'函数'},
]

</script>

循环获取 tods里的值

或者

  <li v-for="todo in tods ">
          获取 id {{user.id}}  获取姓名{{user.name}}

 </li>

用v-for 迭代数字

 <ul>
    <li v-for="todo in 10 ">
      这是第{{todo}}循环
    </li>
</ul>

 

V-on 事件<a v-on:click="doThis"></a> 缩写 <a @click="doThis"></a>

事件修饰符v-on:click

1 <!-- 阻止单击事件继续传播 --> <a v-on:click.stop="doThis"></a>

2 <!-- 点击事件将只会触发一次 --> <a v-on:click.once="doThis"></a>

3<!-- 提交事件不再重载页面 --> <form v-on:submit.prevent="onSubmit"></form> 4<!-- 修饰符可以串联 --> <a v-on:click.stop.prevent="doThat"></a>

5 <!-- 只有修饰符 --> <form v-on:submit.prevent></form> 

6 <!-- 添加事件监听器时使用事件捕获模式 --> 

<!-- 即元素自身触发的事件先在此处理,然后才交由内部元素进行处理 --> 

<div v-on:click.capture="doThis">...</div> 

7 <!-- 只当在 event.target 是当前元素自身时触发处理函数 -->

 <!-- 即事件不是从内部元素触发的 --> <div v-on:click.self="doThat">...</div>

提示:v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。

键值修饰符@keyup

<template> <div>{{n}}</div> <input type="text"  ref="name" @keyup="insert"></input>

v-on:keyup跟随键盘输入调用insert方法

methods: { insert:function () { this.n=this.$refs.name.value;}},

data:  function(){ return{ n:'', } }}

如果v-on:keyup.enter 这样写只有按回车键才能触发里面的方法

 

v-on:input 标签 跟随键盘输入调用方法

页面

<el-col :span="4">
      <el-input placeholder="详细地址(最多输入50个字符)" v-model="data.address"       @input="inputFunction()" :maxlength="30"></el-input>:maxlength="30"//限制输入30个字符
    </el-col>
    <el-col :span="5" >输入{{insert}}个字符</el-col>

方法

methods: {
      inputFunction(){
          this.insert=this.data.address.length
      }},

data

data() {  return { insert:''}},

 

 

 

 

 

elementUi组件下拉框绑定事件无效的解决方案

 

正确打开方式 @click.native绑定点击事件

<el-dropdown>

          <span class="el-dropdown-link" ref="echarType">

           柱状图<i class="el-icon-arrow-down el-icon--right"></i>

          </span>

          <el-dropdown-menu slot="dropdown" >

            <el-dropdown-item>柱状图</el-dropdown-item>

            <el-dropdown-item @click.native="seeTable">表格</el-dropdown-item>

          </el-dropdown-menu>

        </el-dropdown>

 

 

V-bind css绑定  <div v-bind:class={src} </div> 缩写 <div :class={src} </div>

1 绑定一个图片 <img :src="src"></img> 在data中写地址src:"static/test.jpeg",

2  绑定HTML Class   Class 绑定

<div :class="{'textClor':isColor,'textSize':fontsize}">span</div>

Data中写 isColor:true, fontsize:true,

Style中写 .textClor{ text-color: aqua;}    .textSize{font-size: 50px;}

也可以直接绑定数据里的一个对象:

 <template>中写法 <div :class="classObject">span</div>

Data中写 classObject:{'textClor':true,  'textSize':false,}

Style 不变

* 数组语法

  <template>中写法<div :class="[classa,classb]">span</div>

 Data中写  classa:'textClor', classb:'textSize',

Style 不变

   

* 当有多个条件时也可以使用对象语法

<div v-bind:class="[{ active: isActive }, errorClass]"></div> 

3 style 绑定

 <template>写法<div :style="{color:activeClor,fontSize:fontSize +'px'}">span</div>

Data 中写法   activeClor:'red',   fontSize:30,

      * 直接绑定到一个样式对象通常更好,这会让模板更清晰:        

   <template>写法<div :style="text">span</div>

Data 中写法text:{  color:'red',fontSize:'30px',}

      *数组写法

 <template>写法<div :style="[styleObjectA,styleObjectB]">span</div>

Data 中写法   styleObjectA:{  color:'red', fontSize:'30px'},
      styleObjectB:{  textDecoration:'underline'  }添加下划线样式

*多重值

从 2.3.0 起你可以为 style 绑定中的属性提供一个包含多个值的数组,常用于提供多个带前缀的值,例如:

<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>

这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex

 

v-model  表单控件绑定

      可以用 v-model 指令在表单控件元素上创建双向数据绑定。根据控件类型它自动选取正确的方法更新元素。尽管有点神奇,v-model 不过是语法糖,在用户输入事件中更新数据,以及特别处理一些极端例子。

     1*Text

        <template>写法

<div>{{mess}}</div>显示用户输入的值
<input type="text" v-model="mess" placeholder="请输入值"><br>

Data写法 mess:'', 定义一个空的值

 

2* Multiline text 多文本输入checkbox

  <template>写法 

   <div>{{message}}</div>显示用户输入的值

   <textarea v-model="message" placeholder="添加多行"></textarea>

   Data写法message:'', 定义一个空的值

3* 多选框

  <template>写法 

 <div>{{mo}}</div>如果点击就显示为true 如果没点击就显示false
 <input type="checkbox"  v-model="mo">

    Data写法 mo:false, 定义一个为false的值

4* 多个勾选框 绑定到同一个数组

<template>写法

 <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
 <label for="Jack">Jack</label>
 <input type="checkbox" id="john" value="John" v-model="checkedNames">
 <label for="john">John</label>
 <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
 <label for="mike">Mike</label>  <br>
 <span>Checked names: {{ checkedNames | json }}</span>

 *Data写法checkedNames:[],定义一个空的数点击后的值存入mike|john|Jack数组中

其中 input中的id要与label中的for属性值要一致

5* radio 只能选一个的多选框

  <input type="radio" id="one" value="One" v-model="picked">
    <label for="one">One</label><br>
     <input type="radio" id="two" value="Two" v-model="picked">
  <label for="two">Two</label> <br>
  <span>Picked: {{ picked }}</span>

Data中定义个变量接收信息

  picked:[],

7 单选框

<template>写法

<select v-model="sel">
  <option selected>A</option>
  <option>B</option>
  <option>C</option>
</select>
<span>Sel: {{ sel}}</span>

Data中定义个变量接收信息

  data: function () {return { sel:'',  }

8 debounce 设置一个最小的延时,在每次敲击之后延时同步输入框的值与数据。如果每次更新都要进行高耗操作(例如在输入提示中 Ajax 请求),它较为有用。

<input v-model="msg" debounce="500*200">

 

 

父子组件传值

1 通过prop实现通信

子组件的props选项能够接收来自父组件数据。没错,仅仅只能接收,props是单向绑定的,即只能父组件向子组件传递,不能反向。而传递的方式也分为两种:

静态传递

子组件通过props选项来声明一个自定义的属性,然后父组件就可以在嵌套标签的时候,通过这个属性往子组件传递数据了。

* 传页面

 在子面写入组件<template><div style="color: red">  hello world </div></template>

在父页面引用子组件页面 import ssss from './ssss'

 调用   export default { components: {ssss},}

父页面就可以调用子页面的组件了<template><ssss></ssss></template>

* 传自定义属性

     子组件写法

<template> <div >{{message}}</div></template>

export default {props:['message'],  data (){  return{ na:'子组件页面', }}

严谨的写法

Props:{users:{type:Array,required:true}}//type:Array传递的类型

父组件写法

<template> <div>  <users :message="子組件属性"></users>  </div></template>

      <script> import users from './testS' 引入子组件地址  

export default {components: { users},</script> 实例化子组件

动态传递

我们已经知道了可以像上面那样给 props 传入一个静态的值,但是我们更多的情况需要动态的数据。这时候就可以用 v-bind 来实现。通过v-bind绑定props的自定义的属性,传递去过的就不是静态的字符串了,它可以是一个表达式、布尔值、对象等等任何类型的值。

 

父组件写法

<template> <div>

    <users :message="子組件属性1"></users>
    <!--   这是一个javaScript表达式不是一个字符串-->
    <users :message="a+b"></users>
    <users :message="msg"></users> </div>
  </template>

<script>
import users from './testS'

export default {  components: {  users  },

            data() { return { a:'我是子组件2',    b:12334,msg:'我是子组件3'+Math.random()}}}

</script>

子组件不变

 

 

2 通过$ref实现通信

·如果ref用在子组件上,指向的是组件实例,可以理解为对子组件的索引,通过$ref可能获取到在子组件里定义的属性和方法。

·如果ref在普通的 DOM 元素上使用,引用指向的就是 DOM 元素,通过$ref可能获取到该DOM 的属性集合,轻松访问到DOM元素,作用与JQ选择器类似。

子组件写法

<template> <div >{{message}}</div></template>
<script>  export default { data (){return{  message:''  } },
       methods:{ getMessage(m){ this.message=m;}}}
</script>

父组件写法

<template> <div> <h1>这是父组件页面</h1> <users ref="msg"></users> </div></template>
<script> import users from './testS'

export default {

components: { users},
           mounted:function(){

   console.log(this.$refs.msg);//控制台输出信息
           this.$refs.msg.getMessage('我是组件一');  }找到ref名为msg 的构造调用子组件方法

 </script>

 


prop和$ref之间的区别:

prop 着重于数据的传递,它并不能调用子组件里的属性和方法。像创建文章组件时,自定义标题和内容这样的使用场景,最适合使用prop。

$ref 着重于索引,主要用来调用子组件里的属性和方法,其实并不擅长数据传递。而且ref用在dom元素的时候,能使到选择器的作用,这个功能比作为索引更常有用到。

 

 

3 通过$emit实现通信  

vm.$emit( event, arg )
$emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数。

父组件写法

<template> <div><h1>{{title}}</h1><sonn @getMessage="showMsg"></sonn></div></template>

接收子组件名字为getMessage的$emit提交方法命名为showMsg
<scriptimport sonn from './son';
    export default {components:{sonn},
      methods:{showMsg(title){this.title=title;}},把showMsg方法里的数据拿出来
      data(){return{ title:''}},}
</script>

子组件写法

<template><div><h3>这是子组件信息</h3></div></template>
<script>export default {mounted:function() {this.$emit('getMessage','这是父组件') }}
           </script>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

生命周期

1、beforeCreate

在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。

2、created

在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

3、beforeMount

在挂载开始之前被调用:相关的 render 函数首次被调用。

 

该钩子在服务器端渲染期间不被调用。

4、mounted

el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。

 

注意 mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,

5、beforeUpdate

数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。

 

该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行。

6、updated

由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

 

当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。

 

注意 updated 不会承诺所有的子组件也都一起被重绘。如果你希望等到整个视图都重绘完毕,可以用 vm.$nextTick 替换掉 updated

 

 

7、activated

keep-alive 组件激活时调用。

 

该钩子在服务器端渲染期间不被调用。

8、deactivated

keep-alive 组件停用时调用。

 

该钩子在服务器端渲染期间不被调用。

9、beforeDestroy

实例销毁之前调用。在这一步,实例仍然完全可用。

 

该钩子在服务器端渲染期间不被调用。

10、destroyed

Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

 

该钩子在服务器端渲染期间不被调用。

11、errorCaptured

当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。

 

 

 

 

 

 

           vue

杂记 脚手架

console.log()控制台打印输出和alert()差不多   

!important设置Css优先级最高

display: flex; <div style=" flex: 1;"/></div>设置水平状态下div占的宽度比

<style scoped>  设置作用域 只限于目前页面

插值

<template>写法
       <div v-once>{{su}}</div> 当标签中带v-once 时插值处的内容不会更新,但会影响其                             

他节点上的数据绑定
      <input type="button" @click="insert" value="点击">

computed:计算属性 

<template>写法 <div>age+a={{addToA}}</div>

在methods: 中 computed:{addToA:function(){   return this.age+this.a  },

data: 中 a:0,

ref数据绑定

<template> <input type="text"  ref="name"></input>
 <input type="button" @click="insert">

methods:{  insert:function () { this.b=this.$refs.name.value; }},

this.$refs.name.value;获取ref名为name的value值

    data:  function(){return{  n:'',}}}

引图片

<template> <img class="images" :src="imgSrc">

 data: imgSrc:"图片路径",

For循环 循环数组

1 <template> 页面中循环显示数组的方法

<li v-for="(item , index) in brands[brand].category[cate].skill"
    @click="chooseCategories(index)" index 要查询的数组下标

brands[brand] 数组[下标].skill数组内字段
   :class="[skillsIndex===index?'selectedShow choiceBox':'choiceBox']"
>
    {{item.skills}} 显示数组内的字段

</li>

 

2  methods:中用For循环数组内数据

for(let i in this.brands){ i是下标
    console.log(this.brands[this.brand]);
}

全局组件

  在main页面设置

Import User from ‘./components/Users’ //导包 Users是一个vue页面

Vue.component(“users”,Users) //全局注册组件  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

指令

V-text

 更新元素的textContent。如果要更新部分的textContent,需要使用{{ Mustache }} 插值。

<span v-text="msg"></span> <!-- 和下面的一样 --> <span>{{msg}}</span>

V-html

与V-text一样 只是V-text是设置文本的 V-html渲染css的

<div v-html="html"></div>     data 里面的 html:'<h1>教程</h1>',

v-if  判断文本中属性是否为确定的值,如果是就显示后面的属性,如不不是就不显示

<h1 v-if="ok">Hello</h1>

data (){ return {ok:true,}}

默认判断ok 属性是否为true 是就显示Hello 不是就显示为空

v-show

也是根据条件来展示元素的,和v-if的功能类似。但是v-show中如果条件为false就生成代码不显示。而v-if如果条件为false,就直接不生成代码。

 

v-if与 v-else   v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

 <div v-if="Math.random()>0.5">
    sorry
  </div>
  <div v-else>
    not sorry
  </div>
</div>

 

判断Math.random()>0.5 是的话就输出sorry 不是就输出 not sorry

v-else-if

<div v-if="show === 'ab'">ab</div>
<div v-else-if="show === 'b'">b</div>
<div v-else-if="show === 'c'">c</div>
<div v-else>abcde</div>

 

data (){
   return {
        show:'cb',
  }

判断字符串是否为ad 是否为b 是否为c 否则显示abcde

 

 

 

 

 

 

V-for

<template>

<div>
      <ul>
        <li v-for="todo in tods "> 或者"(todo i) in tods " 键是i 值是todo
          {{todo.txt}}
        </li>
      </ul>
    </div>
</template>

 

<script>

data (){
   return {

tods:[
  {txt:'你好'},
  {txt:'数组'},
  {txt:'函数'},
]

</script>

循环获取 tods里的值

或者

  <li v-for="todo in tods ">
          获取 id {{user.id}}  获取姓名{{user.name}}

 </li>

用v-for 迭代数字

 <ul>
    <li v-for="todo in 10 ">
      这是第{{todo}}循环
    </li>
</ul>

 

V-on 事件<a v-on:click="doThis"></a> 缩写 <a @click="doThis"></a>

事件修饰符v-on:click

1 <!-- 阻止单击事件继续传播 --> <a v-on:click.stop="doThis"></a>

2 <!-- 点击事件将只会触发一次 --> <a v-on:click.once="doThis"></a>

3<!-- 提交事件不再重载页面 --> <form v-on:submit.prevent="onSubmit"></form> 4<!-- 修饰符可以串联 --> <a v-on:click.stop.prevent="doThat"></a>

5 <!-- 只有修饰符 --> <form v-on:submit.prevent></form> 

6 <!-- 添加事件监听器时使用事件捕获模式 --> 

<!-- 即元素自身触发的事件先在此处理,然后才交由内部元素进行处理 --> 

<div v-on:click.capture="doThis">...</div> 

7 <!-- 只当在 event.target 是当前元素自身时触发处理函数 -->

 <!-- 即事件不是从内部元素触发的 --> <div v-on:click.self="doThat">...</div>

提示:v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。

键值修饰符@keyup

<template> <div>{{n}}</div> <input type="text"  ref="name" @keyup="insert"></input>

v-on:keyup跟随键盘输入调用insert方法

methods: { insert:function () { this.n=this.$refs.name.value;}},

data:  function(){ return{ n:'', } }}

如果v-on:keyup.enter 这样写只有按回车键才能触发里面的方法

 

v-on:input 标签 跟随键盘输入调用方法

页面

<el-col :span="4">
      <el-input placeholder="详细地址(最多输入50个字符)" v-model="data.address"       @input="inputFunction()" :maxlength="30"></el-input>:maxlength="30"//限制输入30个字符
    </el-col>
    <el-col :span="5" >输入{{insert}}个字符</el-col>

方法

methods: {
      inputFunction(){
          this.insert=this.data.address.length
      }},

data

data() {  return { insert:''}},

 

 

 

 

 

elementUi组件下拉框绑定事件无效的解决方案

 

正确打开方式 @click.native绑定点击事件

<el-dropdown>

          <span class="el-dropdown-link" ref="echarType">

           柱状图<i class="el-icon-arrow-down el-icon--right"></i>

          </span>

          <el-dropdown-menu slot="dropdown" >

            <el-dropdown-item>柱状图</el-dropdown-item>

            <el-dropdown-item @click.native="seeTable">表格</el-dropdown-item>

          </el-dropdown-menu>

        </el-dropdown>

 

 

V-bind css绑定  <div v-bind:class={src} </div> 缩写 <div :class={src} </div>

1 绑定一个图片 <img :src="src"></img> 在data中写地址src:"static/test.jpeg",

2  绑定HTML Class   Class 绑定

<div :class="{'textClor':isColor,'textSize':fontsize}">span</div>

Data中写 isColor:true, fontsize:true,

Style中写 .textClor{ text-color: aqua;}    .textSize{font-size: 50px;}

也可以直接绑定数据里的一个对象:

 <template>中写法 <div :class="classObject">span</div>

Data中写 classObject:{'textClor':true,  'textSize':false,}

Style 不变

* 数组语法

  <template>中写法<div :class="[classa,classb]">span</div>

 Data中写  classa:'textClor', classb:'textSize',

Style 不变

   

* 当有多个条件时也可以使用对象语法

<div v-bind:class="[{ active: isActive }, errorClass]"></div> 

3 style 绑定

 <template>写法<div :style="{color:activeClor,fontSize:fontSize +'px'}">span</div>

Data 中写法   activeClor:'red',   fontSize:30,

      * 直接绑定到一个样式对象通常更好,这会让模板更清晰:        

   <template>写法<div :style="text">span</div>

Data 中写法text:{  color:'red',fontSize:'30px',}

      *数组写法

 <template>写法<div :style="[styleObjectA,styleObjectB]">span</div>

Data 中写法   styleObjectA:{  color:'red', fontSize:'30px'},
      styleObjectB:{  textDecoration:'underline'  }添加下划线样式

*多重值

从 2.3.0 起你可以为 style 绑定中的属性提供一个包含多个值的数组,常用于提供多个带前缀的值,例如:

<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>

这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex

 

v-model  表单控件绑定

      可以用 v-model 指令在表单控件元素上创建双向数据绑定。根据控件类型它自动选取正确的方法更新元素。尽管有点神奇,v-model 不过是语法糖,在用户输入事件中更新数据,以及特别处理一些极端例子。

     1*Text

        <template>写法

<div>{{mess}}</div>显示用户输入的值
<input type="text" v-model="mess" placeholder="请输入值"><br>

Data写法 mess:'', 定义一个空的值

 

2* Multiline text 多文本输入checkbox

  <template>写法 

   <div>{{message}}</div>显示用户输入的值

   <textarea v-model="message" placeholder="添加多行"></textarea>

   Data写法message:'', 定义一个空的值

3* 多选框

  <template>写法 

 <div>{{mo}}</div>如果点击就显示为true 如果没点击就显示false
 <input type="checkbox"  v-model="mo">

    Data写法 mo:false, 定义一个为false的值

4* 多个勾选框 绑定到同一个数组

<template>写法

 <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
 <label for="Jack">Jack</label>
 <input type="checkbox" id="john" value="John" v-model="checkedNames">
 <label for="john">John</label>
 <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
 <label for="mike">Mike</label>  <br>
 <span>Checked names: {{ checkedNames | json }}</span>

 *Data写法checkedNames:[],定义一个空的数点击后的值存入mike|john|Jack数组中

其中 input中的id要与label中的for属性值要一致

5* radio 只能选一个的多选框

  <input type="radio" id="one" value="One" v-model="picked">
    <label for="one">One</label><br>
     <input type="radio" id="two" value="Two" v-model="picked">
  <label for="two">Two</label> <br>
  <span>Picked: {{ picked }}</span>

Data中定义个变量接收信息

  picked:[],

7 单选框

<template>写法

<select v-model="sel">
  <option selected>A</option>
  <option>B</option>
  <option>C</option>
</select>
<span>Sel: {{ sel}}</span>

Data中定义个变量接收信息

  data: function () {return { sel:'',  }

8 debounce 设置一个最小的延时,在每次敲击之后延时同步输入框的值与数据。如果每次更新都要进行高耗操作(例如在输入提示中 Ajax 请求),它较为有用。

<input v-model="msg" debounce="500*200">

 

 

父子组件传值

1 通过prop实现通信

子组件的props选项能够接收来自父组件数据。没错,仅仅只能接收,props是单向绑定的,即只能父组件向子组件传递,不能反向。而传递的方式也分为两种:

静态传递

子组件通过props选项来声明一个自定义的属性,然后父组件就可以在嵌套标签的时候,通过这个属性往子组件传递数据了。

* 传页面

 在子面写入组件<template><div style="color: red">  hello world </div></template>

在父页面引用子组件页面 import ssss from './ssss'

 调用   export default { components: {ssss},}

父页面就可以调用子页面的组件了<template><ssss></ssss></template>

* 传自定义属性

     子组件写法

<template> <div >{{message}}</div></template>

export default {props:['message'],  data (){  return{ na:'子组件页面', }}

严谨的写法

Props:{users:{type:Array,required:true}}//type:Array传递的类型

父组件写法

<template> <div>  <users :message="子組件属性"></users>  </div></template>

      <script> import users from './testS' 引入子组件地址  

export default {components: { users},</script> 实例化子组件

动态传递

我们已经知道了可以像上面那样给 props 传入一个静态的值,但是我们更多的情况需要动态的数据。这时候就可以用 v-bind 来实现。通过v-bind绑定props的自定义的属性,传递去过的就不是静态的字符串了,它可以是一个表达式、布尔值、对象等等任何类型的值。

 

父组件写法

<template> <div>

    <users :message="子組件属性1"></users>
    <!--   这是一个javaScript表达式不是一个字符串-->
    <users :message="a+b"></users>
    <users :message="msg"></users> </div>
  </template>

<script>
import users from './testS'

export default {  components: {  users  },

            data() { return { a:'我是子组件2',    b:12334,msg:'我是子组件3'+Math.random()}}}

</script>

子组件不变

 

 

2 通过$ref实现通信

·如果ref用在子组件上,指向的是组件实例,可以理解为对子组件的索引,通过$ref可能获取到在子组件里定义的属性和方法。

·如果ref在普通的 DOM 元素上使用,引用指向的就是 DOM 元素,通过$ref可能获取到该DOM 的属性集合,轻松访问到DOM元素,作用与JQ选择器类似。

子组件写法

<template> <div >{{message}}</div></template>
<script>  export default { data (){return{  message:''  } },
       methods:{ getMessage(m){ this.message=m;}}}
</script>

父组件写法

<template> <div> <h1>这是父组件页面</h1> <users ref="msg"></users> </div></template>
<script> import users from './testS'

export default {

components: { users},
           mounted:function(){

   console.log(this.$refs.msg);//控制台输出信息
           this.$refs.msg.getMessage('我是组件一');  }找到ref名为msg 的构造调用子组件方法

 </script>

 


prop和$ref之间的区别:

prop 着重于数据的传递,它并不能调用子组件里的属性和方法。像创建文章组件时,自定义标题和内容这样的使用场景,最适合使用prop。

$ref 着重于索引,主要用来调用子组件里的属性和方法,其实并不擅长数据传递。而且ref用在dom元素的时候,能使到选择器的作用,这个功能比作为索引更常有用到。

 

 

3 通过$emit实现通信  

vm.$emit( event, arg )
$emit 绑定一个自定义事件event,当这个这个语句被执行到的时候,就会将参数arg传递给父组件,父组件通过@event监听并接收参数。

父组件写法

<template> <div><h1>{{title}}</h1><sonn @getMessage="showMsg"></sonn></div></template>

接收子组件名字为getMessage的$emit提交方法命名为showMsg
<scriptimport sonn from './son';
    export default {components:{sonn},
      methods:{showMsg(title){this.title=title;}},把showMsg方法里的数据拿出来
      data(){return{ title:''}},}
</script>

子组件写法

<template><div><h3>这是子组件信息</h3></div></template>
<script>export default {mounted:function() {this.$emit('getMessage','这是父组件') }}
           </script>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

生命周期

1、beforeCreate

在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。

2、created

在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

3、beforeMount

在挂载开始之前被调用:相关的 render 函数首次被调用。

 

该钩子在服务器端渲染期间不被调用。

4、mounted

el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。

 

注意 mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,

5、beforeUpdate

数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。

 

该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行。

6、updated

由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

 

当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher 取而代之。

 

注意 updated 不会承诺所有的子组件也都一起被重绘。如果你希望等到整个视图都重绘完毕,可以用 vm.$nextTick 替换掉 updated

 

 

7、activated

keep-alive 组件激活时调用。

 

该钩子在服务器端渲染期间不被调用。

8、deactivated

keep-alive 组件停用时调用。

 

该钩子在服务器端渲染期间不被调用。

9、beforeDestroy

实例销毁之前调用。在这一步,实例仍然完全可用。

 

该钩子在服务器端渲染期间不被调用。

10、destroyed

Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

 

该钩子在服务器端渲染期间不被调用。

11、errorCaptured

当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值