Skip to content

1.el-form 的 form 数据对象新增属性不响应的解决办法

1.在 data 中将属性都提前定义好 2.构造一个新的对象,然后完全替换掉原来的 form 对象 例子:

js
const app = new Vue({
	el: "#app",
	data: () => {
		msg: {
			name: "jingwei";
		}
	},
	methods: {
		addProperty() {
			this.msg.age = 18; //(非响应式)
			// 原则上这是一个赋值行为,所以vue会重新收集新对象的依赖
			this.msg = Object.assign({}, this.msg, { age: 18 }); //(响应式)
		},
	},
});

3.使用$set 方法修改对象属性

2.列表展示,每一个都可以单独展开收起的效果

最简单的实现方法,给对象列表的每一个对象加一个 isShowAll 的标志量

js
//请求数据
res.data.forEach((item) => {
  item.isShowAll = false;
  item.rotateDeg = 135;
});
this.list = res.data;
this.doSearch();

//过滤搜索
doSearch() {
  let list = this.list.filter((item) => {
	if (
	  item.real_name.indexOf(this.userName) > -1 ||
	  item.uname.indexOf(this.userName) > -1
	) {
	  return item;
	}
  });
  this.filterList = list;
},
//点击查看更多
showInfo(index) {
  let item = this.filterList[index];
  item.isShowAll = !item.isShowAll;
  console.log(item);
  if (item.isShowAll) {
	item.rotateDeg = -45;
  } else {
	item.rotateDeg = 135;
  }
  this.$set(this.filterList, index, item); //必须使用 set 方法进行修改
},

页面:

vue
<tr v-if="item.isShowAll">
  <td>
	<div>
	  <dl>
		<dt>局数</dt>

3.component 组件动态渲染

component 组件是 Vue.js 中用于动态渲染其他组件的特殊组件。它可以根据一个变量的值来决定渲染哪个组件,并将组件的属性、事件等动态传递给被渲染的组件。

在你提供的代码中,component 组件被使用来实现动态渲染。下面是代码的解释:

vue
<component
	:is="item.component"
	v-bind="item.attrs"
	v-on="item.event"
	v-model="formModel[key]"
	:id="item.id"
	clearable
	v-if="!item.customContent"
	:style="item.style || 'width:158px'"
></component>

:is="item.component":component 组件的:is 属性用于指定要动态渲染的组件。item.component 的值将决定渲染哪个组件。 v-bind="item.attrs":v-bind 指令用于将 item.attrs 对象中的所有属性绑定到被渲染组件上。这样可以动态传递属性给被渲染的组件。 v-on="item.event":v-on 指令用于将 item.event 对象中的所有事件绑定到被渲染组件上。这样可以动态传递事件处理函数给被渲染的组件。 v-model="formModel[key]":v-model 指令用于在被渲染组件和 formModel[key]之间创建双向数据绑定。这样可以实现表单元素的双向数据绑定。 :id="item.id":将 item.id 的值绑定到被渲染组件的 id 属性上。这通常用于在 JavaScript 中引用组件或设置样式。 clearable:这是一个自定义的属性,可能是针对被渲染组件的特殊功能或行为。(例如 element-ui 中有这个属性) v-if="!item.customContent":使用 v-if 指令根据 item.customContent 的值来决定是否渲染该组件。如果 item.customContent 为假值,则不渲染组件。 :style="item.style || 'width:158px'"::style 绑定用于设置被渲染组件的样式。item.style 的值将用作样式,如果不存在,则使用默认样式'width:158px'。 通过使用 component 组件和上述指令和绑定,可以根据 item.component 的值动态渲染不同的组件,并将属性、事件、样式等动态传递给这些组件。

注意:component 组件可以被看作是一个高阶组件(Higher-Order Component,HOC)的一种实现方式。高阶组件是一种模式,用于在 React 和 Vue 等框架中共享组件逻辑。它接收一个组件作为输入,并返回一个新的组件。 不过虽然 component 组件具有类似高阶组件的动态渲染能力,但它在 Vue.js 中并没有提供类似高阶组件的其他功能,比如对组件生命周期的直接控制、属性代理等。component 组件主要用于动态渲染其他组件,并通过指令和绑定将属性、事件等动态传递给被渲染组件,而不涉及其他高阶组件的功能。