Vue 碎知识

1,Vue



 


 


 


 


...

 


...

 


 

1,$nextTick

$nextTick的用法_风如也的博客-CSDN博客_$nexttick的使用

实现全屏效果,把内容展示在全屏状态对话框里面

  title=""
  :visible.sync="dialogVisiblefull"
  :fullscreen="true"
  :before-close="()=>{dialogVisiblefull = false}">
 


 

当点击全屏,先触发对话框,onclick: function () {
  //方法1 对话框
  self.dialogVisiblefull = true
  self.$nextTick(function () {
    self.arrange('Robotoptionfull')
  })
}

vue的slot主要分三种,

默认插槽

具名插槽

作用域插槽

使用插槽是在存在父子关系的组件中使用

使用 Vue 组件来简化页面逻辑:

首先我们需要通过import的方式导入子组件。
然后在components中注册子组件。
最后将子组件挂载到模板中,并将需要子组件展示的数据传给子组件。

 Props 验证使用 propTypes,它可以保证我们的应用组件被正确使用

state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。

componentDidMount() 与 componentWillUnmount() 方法被称作生命周期钩子。


在组件输出到 DOM 后会执行 componentDidMount() 钩子,我们就可以在这个钩子上设置一个定时器。
 

his.timerID 为定时器的 ID,我们可以在 componentWillUnmount() 钩子中卸载定时器。
注意,在添加属性时, class 属性需要写成 className ,for 属性需要写成 htmlFor ,这是因为 class 和 for 是 JavaScript 的保留字。

vue项目中子组件watch不到父组件传递的props变化


当给columnField的alias和description属性直接赋值时,这两个属性并不是响应式的,所以子组件中watch不到columnField的变化。

定义columnField的同时定义属性  使用vue.set添加属性,保证属性是响应式的 Vue.set(this.columnField,'alias',element.alias);
    Vue.set(this.columnField,'description',element.description);

vue从入门到进阶:组件Component详解(六)

https://www.cnblogs.com/moqiutao/p/8328931.html


(重要)如果你想把一个对象的所有属性作为 prop 进行传递,可以使用不带任何参数的 v-bind (即用 v-bind 而不是 v-bind:prop-name)。

将 store 当做参数传给 Vue 进行初始化之后,

Vue 就会将 Store 里的 state (state 参数用来存放全局的状态,)注入到所有的 Vue 组件中,这样所有的 Vue 组件共享同一个全局的 state

el-row


 


通过制定 col 组件的 offset 属性可以指定分栏偏移的栏数。
将 type 属性赋值为 'flex',可以启用 flex 布局,并可通过 justify 属性来指定 start, center, end, space-between, space-around 其中的值来定义子元素的排版方式。

设置盒子属性 盒子居中
justify="end"
justify="space-between"
justify="space-around"


 


使用 Vuex

Getters 复用本地数据获取逻辑,可以通过两种方式访问 getter,

一个是通过属性访问this.$store.getter.allProducts,

另一个是通过方法访问:this.$store.getter.productById(id)
可以接受两个参数:state和getters,state就表示本地数据源;我们可以通过第二个参数getters获取到不同的getter属性。

Action 获取远程数据,并将获取的数据提交到对应的 Mutation 中:
Mutation 修改本地状态
this.$store.dispatch() 与 this.$store.commit()方法的区别总的来说他们只是存取方式的不同,两个方法都是传值给vuex的mutation改变state


this.$store.dispatch() 含有异步操作,例如向后台提交数据,

写法:this.$store.dispatch(‘action方法名’,值)
this.$store.commit():同步操作

写法:this.$store.commit(‘mutations方法名’,值)

commit: 同步操作

存储 this.$store.commit('changeValue',name)
取值 this.$store.state.changeValue


dispatch: 异步操作

存储 this.$store.dispatch('getlists',name)
取值 this.$store.getters.getlists

vue element ui 实现动态表格/表单(新增/删除行)

   
                             :data="paramsSettingForm.tableData"
               style="width: 100%"
               class="list-table"
               size="mini"
 addList () {
      this.paramsSettingForm.tableData.push({
        beginTime: '',
        endTime: ''
      }),

对子组件属性prop进行“双向绑定”

this.$emit('update:father-num',100);

 

elementUI,在禁用的表单下,取消其中一个input输入框的禁用,

---嵌入一个子form  
   
     
        不禁用
     

   

在select的change事件中调用此方法,运用 this.$forceUpdate()强制刷新,页面正常选值

自定义 dataView 展现函数,用以取代默认的 textarea 使用更丰富的数据编辑。可以返回 dom 对象或者 html 字符串。


 

vue+ element 中如果想要获取当前点击元素的index    scope.$index

el-table type="expand" 子项无数据时不显示展开按钮


父级父级表格设置属性 :row-class-name="getRowClass"表格设置属性 :row-class-name="getRowClass" // 判断表格是否有子项,无子项不显示展开按钮

tab页  切换



     
        人员信息
       
     

   


tab页,但是vue会帮你把你写的所有tab页的内容都渲染出来了如果每个tab页的数据都过大的时候,可能就会导致首次打开页面卡顿现象当v-if的值为false时vue是不会去渲染该标签下的内容的就把tabs下的子模块

标签上加v-if,一开始只设置其中一个为true其他都为false,当点击tab切换时去改变v-if的值,代码如下↓


el-table 文字居中:

header-cell-style="{'text-align':'center'}" :cell-style="{'text-align':'center'}"

使用type='selection'实现多选需要禁用某一行

type="selection" :selectable='checkboxSelect'

 checkboxSelect (row, rowIndex) {
        if (rowIndex == 0) {
          return false // 禁用
        }else{
          return true // 不禁用
        }
      }

实现全屏效果,把内容展示在全屏状态对话框里面,

  title=""
  :visible.sync="dialogVisiblefull"
  :fullscreen="true"
  :before-close="()=>{dialogVisiblefull = false}">
 


 


当点击全屏,先触发对话框,
onclick: function () {
  //方法1 对话框
  self.dialogVisiblefull = true
  self.$nextTick(function () {
    self.arrange('Robotoptionfull')
  })
}

为了能够防止内容超出弹框,并且一直看到footer里的按钮,

需要固定对话框的高度在对话框内容元素的外面加一个 div,然后设置 div 的高度,并且设置 overflow: auto,这样,内容超出时会出现滚动条,可以进行滑动,

使用vue的插槽,

建一个template的插槽。名字用description 

element的表格中scope中
$index中存着当前行,在表格的列表中的索引值column本列的数据row本行的数据

通过slot name的属性,将template slot="name名" 一一对应起来

新版本语法 v-slot

在旧版本中slot="xxx"的情况下,可以挂载在非 template标签上,

如:

老虎

但是在v-slot:tit的情况下,必须使用template标签

props

是一个从外部传进组件的参数,主要作为就是从父组件向子组件传递数据,它具有可读性和不变性,只能通过外部组件主动传入新的 props 来重新渲染子组件,否则子组件的 props 以及展现形式不会改变。

// props: {
    //   dataTime: {
    //     type: Array,
    //   },
    //   typeChange:{
    //     type: Function
    //   }
    // },

state 

主要作用是用于组件保存、控制以及修改自己的状态,它只能在 constructor 中初始化,它算是组件的私有属性,不可通过外部访问和修改,只能通过组件内部的 this.setState 来修改,修改 state 属性会导致组件的重新渲染

Refs

是使用 React.createRef() 创建的,并通过 ref 属性附加到 React 元素。在构造组件时,通常将 Refs 分配给实例属性,以便可以在整个组件中引用它们。

upload组件


因为element的upload组件对这个name设置的默认值是name = "file",如果这个时候后台的接收文件的接口的这个文件的字段名也设置的是file的话就不用设置这个name也可以成功上传文件,如果后台把这个文件的字段名改了那就必须设置成和后台一样的才行
:on-change="encFileEdit" encFileEdit(file,fileList){
  if(fileList.length>1){      //这里只获取最后一次选择的文件
    fileList.splice(0,1);
  }
  if(fileList.length>0){     //如果有文件的情况下获取文件流
     this.applyInfo.enc_cert_name = fileList[0].raw;
  }
},


设置某个元素或对象不允许拖动拖拽把这些元素的样式名称设置到filter属性即可:class="item.id==1?'forbid':''


Dialog 的内容是懒渲染的,即在第一次被打开之前,传入的默认 slot 不会被渲染到 DOM 上。因此,如果需要执行 DOM 操作,或通过 ref 获取相应组件,请在 open 事件回调中进行。
在对话框表格中,绑定的data绑定了其它表格,在第一次对话框打卡时,总是显示暂无数据,

多次调用的组件这样引入,可以让name不和父组件冲突

components: {
Demo: () => import('...')
}


解决el-table排序时当某列数据有空值导致排序错乱的问题:

key="tableKey"   ++this.tableKey


 给el-table筛选条件设置默认筛选条件(设置默认过滤值)

this.$refs.filterTable.columns[3].filteredValue = ['家'];

stripe 设置了斑马文table效果在设置 row-class-name 会斑马文显示


let obj = {};

let peon = person.reduce((cur,next) => {
    obj[next.id] ? "" : obj[next.id] = true && cur.push(next);
    return cur;
},[])

路由传参-和name配对的是params,和path配对的是query。


是在html中实现的跳转
this.$router.push({path: '/t?index=1'})在js中实现的跳转并传参的方法


dataTransfer.setData() 方法设置被拖数据的数据类型和值:

为el-select添加filterable属性即可启用搜索功能。

默认情况下,Select 会找出所有label属性包含输入值的选项。


当 elementUi 选中一个值,其余选项全部高亮解决


1value绑定的是 item 的对象;
2.首先在 el-option 中添加 :key="item.id"的属性;
3.然后在 el-select 添加 value-key="id" 属性,注意 value-key 前面没有:
4.注意 value-key 的值与 key 绑定的属性值对应。


elementUI select有值却无法选中

在select绑定的change函数中使用this.$forceUpdate();

 //路由跳转指定页面
this. $router.push({ path: "/”});
v-for 指令可以绑定数组的数据来渲染一个项目列表:

“:” 是指令 属性绑定 : “v-bind”的缩写,

v-bind 用于动态绑定属性值该指令的意思是:“将这个元素节点的特性和 Vue 实例的属性保持一致”。

“.”是修饰符,修饰符 (Modifiers) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():


“@”是指令“v-on”的缩写;

@click  @submit  事件绑定 @


 

match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。stringObject.match(regexp),regexp必需。规定要匹配的模式的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。使用 

@submit.prevent   .prevent 表示提交以后不刷新页面

prevent是preventDefault,阻止标签默认行为,有些标签有默认行为,例如a标签的跳转链接属性href等。
submit点击默认行为是提交表单,这里并不需要它提交,只需要执行addMemo方法,故阻止为好。

一个组件的 data 选项必须是一个函数 data: function () {}


全局注册的组件可以用在其组件树中的所有子组件的模板中。

vue父子组件传参的4种方式
 

https://blog.csdn.net/glorydx/article/details/112247747


父组件 传参给子组件   
方法1   父组件直接绑定在子组件的标签上,子组件通过props接收传递过来的参数。
              直接传值

在子组件中加  props: ['title'], 接收
               间接传值

 

  posts是new Vue 里面data 数组  { id: 1, title: 'My journey with Vue' },


方法2   父组件主动获取所有的参数和方法(子组件被动传参)
 methods: {
onClickChangePhone() {
// 父组件调用子组件中的showPhone方法
      this.$refs.phoneRef.showPhone();
}
}
v-if="visible"
 showPhone() {
      this.visible = true
    },


方式一  子组件(主动)向父组件传参    

     子组件接收一个父组件传递过来的方法,将要传递给父组件的参数作为该方法的参数使用。

样式 :style="{ fontSize: postFontSize + 'em' }"


方法2  子组件 传参给 父组件   子组件向父组件传参 $emit
  子组件:v-on:click="$emit('enlarge-text', 0.1)"  通过 $event 访问到被抛出的0.1这个值:        
  父组件:v-on:enlarge-text="postFontSize += $event"

动态组件 is


渲染一个“元组件”为动态组件。依 is 的值,来决定哪个组件被渲染。
动态组件 使用 is attribute 来切换不同的组件:


 

使用webpack 的模块系统。

创一个 components 目录,将每个组件放置在各自的文件中,

然后 局部注册 之前导入 使用 的组件。

import ComponentA from './ComponentA'

对于绝大多数 attribute 来说,从外部提供给组件的值会替换掉组件内部设置好的值,父组件如果传入 type="text" 就会替换掉子组件的 type="date"
class 和 style attribute 会智能一些,即两边的值会被合并起来,从而得到最终的值:

v-on 事件监听器在 DOM 模板中会被自动转换为全小写


当组件渲染的时候,子组件 里的 将会被替换为“Your Profile”。

插槽内可以包含任何模板代码,包括 HTML:甚至其它的组件
父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。