
- 官网:https://v2.cn.vuejs.org/v2/guide/components-slots.html
- <template>
- 1.指令
- v-if v-else 用 key 管理可复用的元素 注意我们不推荐在同一元素上使用 v-if 和 v-for
-
- v-show css的dispaly:none;
-
- v-for:遍历数组<li v-for="(item,index) in [1,2,3,4]" :key="index">{{ item }}</li>
- //也可以用 v-for 来遍历一个对象的 property 列如:<li v-for="(value, name, index) in object">{{ index }}{{ name }}{{ value }}</li>
- //为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key attribute(不要使用对象或数组之类的非基本类型值作为 v-for 的 key。请用字符串或数值类型的值。)
- //数组更新检测push() pop() shift() unshift() splice() sort() reverse()
- //当在组件上使用 v-for 时,key 现在是必须的。
-
- v-once
-
- v-html
-
- v-bind:简写:动态参数<a v-bind:[attributeName]="url"> ... </a> 例如,如果你的 Vue 实例有一个 data property attributeName,其值为 "href",data(){return{attributeName:'href'}}那么这个绑定将等价于<a v-bind:href="url"> ... </a> 。
-
- v-on: 事件处理 v-on:click='hanleClick' 简写 @click='hanleClick'
- //事件修饰符.stop .prevent .capture .self .once .passive
- //官方代码示例:
- <!-- 阻止单击事件继续传播 -->
- <a v-on:click.stop="doThis"></a>
- <!-- 提交事件不再重载页面 -->
- <form v-on:submit.prevent="onSubmit"></form>
- <!-- 修饰符可以串联 -->
- <a v-on:click.stop.prevent="doThat"></a>
- <!-- 只有修饰符 -->
- <form v-on:submit.prevent></form>
- <!-- 添加事件监听器时使用事件捕获模式 -->
- <!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 -->
- <div v-on:click.capture="doThis">...</div>
- <!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
- <!-- 即事件不是从内部元素触发的 -->
- <div v-on:click.self="doThat">...</div>
- <!-- 点击事件将只会触发一次 -->
- <a v-on:click.once="doThis"></a>
- //Vue 还对应 addEventListener 中的 passive 选项提供了 .passive 修饰符。
- <!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
- <!-- 而不会等待 `onScroll` 完成 -->
- <!-- 这其中包含 `event.preventDefault()` 的情况 -->
- <div v-on:scroll.passive="onScroll">...</div>
- 这个 .passive 修饰符尤其能够提升移动端的性能。不要把 .passive 和 .prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。请记住,.passive 会告诉浏览器你不想阻止事件的默认行为。
- //按键修饰符
- <!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` -->
- <input v-on:keyup.enter="submit">
- <input v-on:keyup.page-down="onPageDown">
- <input v-on:keyup.13="submit">
- 其他别名.enter .tab .delete (捕获“删除”和“退格”键) .esc.space.up.down.left.right
- 你还可以通过全局 config.keyCodes 对象自定义按键修饰符别名:
- //可以使用 `v-on:keyup.f1` Vue.config.keyCodes.f1 = 112
- //系统修饰键 .ctrl.alt.shift.meta
- //鼠标按钮修饰符.left .right .middle
-
-
- v-model:表单输入绑定 v-bind 和 v-on 的结合使用<input v-model='a' /> ==> <a v-bind:value='a' @input='inputChange'>
- //修饰符
- .lazy在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 。你可以添加 lazy 修饰符,从而转为在 (change或失去焦点或按回车时才更新)事件_之后_进行同步:
- <input type="text" v-model.lazy="message">
- .number: 将输入的值转换为Number类型
- .trim: 过滤掉输入的首尾空格
-
-
- //Class 与 Style 绑定 active:css样式表 可以接收一个对象或者数组
- <li v-for='(item,index) in [1,2,3,4]' :class="{ active: selectIndex == index }"></li>
- <li v-for='(item,index) in [1,2,3,4]' :class="[{ active: selectIndex == index }, {color:red;}]"></li>
-
- v-slot
-
-
- v-pre
-
-
- v-cloak
-
- //动态组件:
- //有的时候,在不同组件之间进行动态切换是非常有用的,比如在一个多标签的界面里
- <!-- 组件会在 `currentTabComponent` 改变时改变 -->
- <component v-bind:is="currentTabComponent"></component>
- <component @jump='addTab' :is="item.component"></component>//运维项目就用到了v-bind:is
- //组件名大小写
- 使用 kebab-case:my-component-name
- 使用 PascalCase:MyComponentName,首字母大写命名
- Prop 类型 单向数据流
- ['a','b']
- a: {
- type: Array,//[String,Number,Boolean,Array,Object,Date,Function,Symbol]中的一个或多个
- default: [],//数组
- require:true // 必填
- },
- props: {
- // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
- propA: Number,
- // 多个可能的类型
- propB: [String, Number],
- // 必填的字符串
- propC: {
- type: String,
- required: true
- },
- // 带有默认值的数字
- propD: {
- type: Number,
- default: 100
- },
- // 带有默认值的对象
- propE: {
- type: Object,
- // 对象或数组默认值必须从一个工厂函数获取
- default: function () {
- return { message: 'hello' }
- }
- },
- // 自定义验证函数
- propF: {
- validator: function (value) {
- // 这个值必须匹配下列字符串中的一个
- return ['success', 'warning', 'danger'].includes(value)
- }
- }
- }
- //注意那些 prop 会在一个组件实例创建之前进行验证,所以实例的 property (如 data、computed 等) 在 default 或 validator 函数中是不可用的。
-
-
-
- //自定义事件
- this.$emit('myEvent')
- <my-component v-on:my-event="doSomething"></my-component>
- 将原生事件绑定到组件:你可能有很多次想要在一个组件的根元素上直接监听一个原生事件。这时,你可以使用 v-on 的 .native 修饰符:
- <base-input v-on:focus.native="onFocus"></base-input>
- .sync 修饰符官方解释:在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以变更父组件,且在父组件和子组件两侧都没有明显的变更来源。
- this.$emit('update:title', newTitle)
- <text-document v-bind:title="doc.title" v-on:update:title="doc.title = $event"</text-document>
- 为了方便这种写法,vue提供了.sync修饰符,说白了就是一种简写的方式,我们可以将其当作是一种语法糖,比如v-on: click可以简写为@click。而上边父组件的这种写法,换成sync的方式就像下边这样:
- <text-document :title.sync="title"></text-document>
-
-
-
-
- </template>
-
- export default{
-
- 01.name:'',//只有作为组件选项时起作用
- 02.data(){
- //一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝
- selectIndex: -1, //选中的状态
-
- },
- 03.methods:{
- reversedMessage: function () {// `this` 指向 vm 实例
- return this.message.split('').reverse().join('')
- }
- },
- 04.computed:{
- //计算属性是基于它们的响应式依赖进行缓存的,只在相关响应式依赖发生改变时它们才会重新求值。
- reversedMessage: function () {// `this` 指向 vm 实例
- return this.message.split('').reverse().join('')
- }
- //计算属性的 setter 计算属性默认只有 getter,不过在需要时你也可以提供一个 setter:
- fullName: {
- // getter
- get: function () {
- return this.firstName + ' ' + this.lastName
- },
- // setter
- set: function (newValue) {
- var names = newValue.split(' ')
- this.firstName = names[0]
- this.lastName = names[names.length - 1]
- }
- }
- },
- 05.componets:{},
- 06.watch(){
- //侦听器 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch——特别是如果你之前使用过 AngularJS。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调
- // 如果 `question` 发生改变,这个函数就会运行
- question: function (newQuestion, oldQuestion) {
- this.answer = 'Waiting for you to stop typing...'
- this.debouncedGetAnswer()
- }
- //首次执行
- },
- 07.beforeCreate(){},
- 08.created(){},
- 09.beforeMount(){},
- 10.mounted(){},
- 11.beforeUpdate(){},
- 12.updated(){},
- 13.active(){},
- 14.deactive(){},
- 15.beforedestory(){},
- 16.destoryed(){},
- 16.1.errorCaptured(){//在捕获一个来自后代组件的错误时被调用},
- 17.nextTick(){},
- 18.beforeRouteEnter(to, from, next){},
- 19.beforeRouteUpdate(to, from, next){},
- 20.beforeRouteLeave(to, from, next){},
- 21.mixins:[],
- 22.props:[] or {},
- 23.filters:{},
- 24.provide(){},
- 25.inject:[],
- 26.inheritAttrs: false,//如果你不希望组件的根元素继承特性,你可以在组件的选项中设置
- 27.directives{has: { inserted(el){ el.focus()} } }// 自定义指令
- 28.extends
- 29.delimiters://改变纯文本插入分隔符.
- 30.functional://使组件无状态 (没有 data) 和无实例 (没有 this 上下文)。他们用一个简单的 render 函数返回虚拟节点使它们渲染的代价更小。
- 31.inheritAttrs://默认情况下父作用域的不被认作 props 的 attribute 绑定 (attribute bindings) 将会“回退”且作为普通的 HTML attribute 应用在子组件的根元素上.注意:这个选项不影响 class 和 style 绑定。
- 32.comments:当设为 true 时,将会保留且渲染模板中的 HTML 注释。默认行为是舍弃它们。
- 33.render(h)=>{
- //在options api中使用h函数
- //jsx语法,h是crealElement方法.
- /createElement(TagName,Option,Content)接受三个参数
- /createElement(" 定义的元素 ",{ 元素的性质 }," 元素的内容"/[元素的内容])
- return h("div",{style:{color:red;}},"我是render渲染函数")
- }
- h函数接收三个参数。
- 第一个参数:,可以为一个html标签,一个组件,一个异步组件,或者是一个函数式组件。
- 第二个参数:{ Object } Props,与attributes和props,以及事件对应的对象,我们可以在模板中使用,如果没有需要传入的属性,可以设置为null。
- 第三个参数:{String | Object |Array}可以是字符串Text文本或者是h函数构建的对象再者可以是有插槽的对象。
- //举个小栗子
- render:(h) => {
- return h('div',{
- //给div绑定value属性
- props: {
- value:''
- },
- //给div绑定样式
- style:{
- width:'30px'
- },
- //给div绑定点击事件
- on: {
- click: () => {
- console.log('点击事件')
- }
- },
- })
- }
- }
-
- }
-
- <style scoped>
- .active {
- background: #f00;
- color: #ff9;
- }
- </style>
如有不足,广大博友查漏补缺...