自学内容网 自学内容网

前端问答

目录

1、ref和reactive的区别

2、ElementPlus中什么是slot槽

3、对话框、自定义标题、表单、展现控制、新增和修改控制

4、雪花算法引起javascript long型精度问题及解决方案

5、什么是RESTful

6、对象赋值和Object.Assign的区别

7、如果实现修改回显

8、如何实现新增清空数据


1、ref和reactive的区别

ref

  1. 基本用途ref主要用于创建可被追踪的、可变的单一值的响应式引用。当你需要对某个具体的值(如一个数字、字符串或对象)进行响应式处理时,可以使用ref。它返回一个对象,其.value属性包含实际的值,并且这个值是响应式的。

  2. 深层访问:对于嵌套的对象或数组,直接访问其内部属性或元素不会自动使其变为响应式的。你需要通过.value来访问或修改嵌套内容以保持响应性。(ref 主要用于原始数据类型,尽管它可以用于复杂类型,但需要通过.value 来访问)

  3. 模板绑定:在模板中,可以直接绑定到ref.value,但在Composition API中更常见的是通过解包(.value)来访问基础值。

  4. 应用场景:适合于简单的数据属性或者需要直接操作DOM元素(Vue 2中的ref也用于获取DOM引用,但这里主要讨论Vue 3的Composition API中的用法)。

reactive

  1. 基本用途reactive用于创建整个对象或数组的响应式代理。与ref不同,它使对象的所有属性都成为响应式的,无需通过额外的.value访问。这意味着你可以在对象上直接进行读取和修改,所有变化都会被Vue自动追踪。

  2. 深层响应:当对象内部的属性发生变化时,Vue会自动检测并更新依赖它的视图。这对于处理具有多个层级的数据结构特别有用。(reactive 则直接用于复杂数据类型,如对象和数组,可以像普通 JavaScript 对象一样直接访问和修改属性。)

  3. 模板绑定:通常不直接在模板中使用reactive对象,因为Vue模板期望的是简单数据或ref包装的值。但在Composition API的setup函数内部,可以直接操作reactive定义的状态。

  4. 应用场景:适合管理具有多个属性的状态对象,特别是当这些属性之间存在复杂交互或需要整体管理时。


2、ElementPlus中什么是slot槽

在ElementPlus框架中,slot是一个非常核心的概念,它沿用了Web组件规范中的Slot API,用于实现组件内容的分发与复用。简单来说,slot提供了一种方式,允许你在父组件中定义一些内容,然后在子组件中指定位置插入这些内容。这使得组件更加灵活和可重用,因为你可以在不修改子组件源码的情况下,改变子组件内部的一部分布局或内容。

ElementPlus中的slot主要分为以下几种类型:

  1. 默认插槽(Default Slot):如果不给slot属性指定名称,那么该内容将会填充到子组件中定义的默认插槽位置。这是最常用的插槽类型,用于替换子组件内部的默认内容区域。

  2. 具名插槽(Named Slots):通过给slot属性指定一个名称,你可以创建多个不同的内容插入点。这样,在子组件中可以按名称区分并插入对应的内容。

  3. 作用域插槽(Scoped Slots):作用域插槽允许子组件向插槽内容传递数据。在子组件中,你可以定义要传递的数据,并在插槽标签内通过特殊的属性(如slot-scope在Vue 2中,或v-slot指令在Vue 3中)来接收这些数据。这样,父组件可以在插槽内容中使用子组件提供的数据。

    <el-table-column label="操作" width="190px;" align="center">
    <template #default="scope">
    <el-button type="primary" size="small" @click="toupdate(scope.row)">
    修改</el-button>
    <el-button type="danger" size="small" @click="del(scope.row)">
    删除</el-button>
    </template>
    </el-table-column>


3、对话框、自定义标题、表单、展现控制、新增和修改控制

对话框(Dialog)

对话框是一种模态窗口,用于临时中断用户与应用的主要交互,以集中注意力处理特定任务或获取用户确认。它可以用于显示警告、提示信息、询问用户选择或收集输入数据。

<el-dialog v-model="dialogFormVisible" width="500">
<template #header>
{{dialogTitle}}商品分类管理
</template>
<el-form :model="form">
<el-form-item label="分类">
<el-input v-model="form.name" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogFormVisible = false">取消</el-button>
<el-button type="primary" @click="save">保存</el-button>
</div>
</template>
</el-dialog>

自定义标题

在对话框中,自定义标题可以让用户一目了然地知道对话框的目的。例如,在一个“新建项目”对话框中,标题可以是“创建新项目”,清晰指示对话框的功能。

表单(Form)

表单是收集和提交用户输入数据的核心组件。在对话框中嵌入表单,可以用来新增或修改数据。表单通常包括各种输入字段(如文本框、下拉选择、复选框等),以及提交和重置按钮。

展现控制

展现控制涉及如何组织和展示表单及对话框内的内容,以优化用户体验。这可能包括条件显示某些字段(根据用户的选择动态显示或隐藏)、分步骤表单、数据验证提示等,确保界面简洁且易于理解。

新增和修改控制

新增控制:在对话框中设计一个表单用于用户输入新数据的各个字段,并提供明确的“创建”或“添加”按钮。点击按钮后,收集表单数据并通过API请求发送到服务器,实现数据的新增。

修改控制:对于修改现有数据,可以通过传递要编辑项的ID或详细信息到对话框,并预先填充表单字段。用户可以修改这些字段后点击“保存”或“更新”按钮,将更改的数据提交至服务器进行更新。

<el-card style="width: 700px;">
<el-button type="primary" size="small" @click="toadd">新增</el-button>
<el-table :data="state.tableData">
<el-table-column type="selection" width="55" />
<el-table-column property="id" label="编号"/>
<el-table-column property="name" label="商品分类"/>
<el-table-column align="center" label="操作">
<template #default="scope">
<el-button type="success" size="small"
@click="toupdate(scope.row)">修改</el-button>
<el-button type="danger" size="small" @click="del(scope.row.id)">
删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>


4、雪花算法引起javascript long型精度问题及解决方案

使用System.Text.Json命名空间下的JsonConverter<long>实现,它是针对.NET Core 3.0及以上版本中的System.Text.Json序列化器的自定义转换器。这个转换器能够将long类型在序列化时转为字符串,在反序列化时再从字符串转回long,以解决JavaScript处理大整数精度丢失的问题。

internal class LongToStringConverter : JsonConverter<long>
{
    public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 读取时将字符串转换回long
        return long.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
    {
        // 写入时将long转换为字符串
        writer.WriteStringValue(value.ToString());
    }
}

确保你的项目中已经引用了System.Text.Json命名空间。然后,你可以在类的属性上使用这个转换器

using System.Text.Json.Serialization;

public class MyModel
{
    [JsonConverter(typeof(LongToStringConverter))]
    public long?LargeId { get; set; }
}



5、什么是RESTful

RESTful是一种网络应用程序的设计风格和开发方式,基于HTTP协议,利用URI(Uniform Resource Identifier,统一资源标识符)来访问和操作网络资源。REST是Representational State Transfer的缩写,由Roy Fielding在其2000年的博士论文中首次提出。

RESTful架构的核心原则主要包括:

1.无状态(Stateless):服务器不保存客户端的状态信息,每次请求都包含处理该请求所需的所有信息。会话状态应该全部由客户端负责维护。

2.客户端-服务器(Client-Server):清晰分离客户端和服务器的职责。客户端负责用户界面和用户交互,服务器负责数据处理和业务逻辑。

3.缓存(Cacheable):响应数据标明是否可缓存,以利用HTTP协议的缓存机制提高性能。

4.统一接口(Uniform Interface):所有资源都通过统一的接口进行访问,主要通过HTTP方法(GET, POST, PUT, DELETE等)和资源的URI来实现。

5.分层系统(Layered System):通过中间层(如代理服务器、负载均衡器)可以简化复杂系统的设计,客户端不需要知道它是否在与最终服务器还是中间层交互。

6.按需代码(Code-On-Demand,可选):服务器可以提供执行环境给客户端,比如JavaScript,以增强客户端功能,但这不是强制性的。


6、对象赋值和Object.Assign的区别

对象赋值(Shallow Copy/Clone)

直接使用等号(=)进行对象赋值时,实际上是创建了一个指向原对象的新引用,而不是创建一个新的对象副本。这意味着,当你修改新引用指向的对象时,原对象也会受到影响,因为两者共享同一块内存空间。这种复制方式被称为浅拷贝。

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = obj1;

obj2.a = 3; // 修改obj2的属性a
console.log(obj1); // { a: 3, b: { c: 2 } },obj1也被修改了

obj2.b.c = 4; // 修改嵌套对象的属性c
console.log(obj1.b.c); // 4,同样影响到了obj1

Object.assign()

Object.assign()方法用于将源对象(source objects)的所有可枚举自有属性的值复制到目标对象(target object)。它返回目标对象。这个方法执行的是浅拷贝,但对于一层的对象属性,它会创建新的属性副本,而不是仅仅复制引用。

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = Object.assign({}, obj1);

obj2.a = 3; // 修改obj2的属性a
console.log(obj1); // { a: 1, b: { c: 2 } },obj1未受影响

obj2.b.c = 4; // 修改嵌套对象的属性c
console.log(obj1.b.c); // 4,obj1的嵌套对象属性被修改,因为是浅拷贝


7、如果实现修改回显

const toupdate = (row)=>{
dialogFormVisible.value = true
dialogTitle.value = "修改"
//对象复制
Object.assign(form, row)
}

1. 数据准备

首先,确保你从后端API获取到了需要回显的数据。这通常涉及发起一个HTTP请求(如GET请求)来获取特定记录的信息。

// 假设使用axios进行HTTP请求
axios.get('/api/user/123') // 请求用户ID为123的用户信息
  .then(response => {
    this.userData = response.data; // 将获取的数据赋值给Vue实例的userData属性
  });

2. Vue模板绑定

在Vue模板中,使用双括号{{ }}进行文本插值,或者使用v-model指令进行双向数据绑定,来展示和绑定这些数据到表单字段。

<template>
  <form>
    <label for="username">用户名:</label>
    <input type="text" id="username" v-model="userData.username">
    
    <label for="email">邮箱:</label>
    <input type="email" id="email" v-model="userData.email">
    
    <!-- 更多字段... -->
    
    <button type="submit">保存修改</button>
  </form>
</template>

3. 处理表单提交

当用户修改并提交表单时,你需要捕获这个事件,并通过HTTP请求(如PUT或PATCH请求)将更新后的数据发送回服务器。

methods: {
  onSubmit() {
    axios.put('/api/user/123', this.userData)
      .then(() => {
        alert('信息更新成功!');
        // 可以重置表单或执行其他逻辑
      })
      .catch(error => {
        console.error('更新失败:', error);
      });
  }
}

4. 错误处理与反馈

确保有适当的错误处理逻辑,并向用户提供视觉或文字反馈,告知操作结果。


8、如何实现新增清空数据

//转向新增方法(打开对话框)
const toadd = ()=>{
dialogFormVisible.value = true
dialogTitle.value = "新增"
Object.assign(form, formInit) //清空
}

1. 初始化数据对象

首先,在Vue实例的data选项中定义一个数据对象,用于存储表单字段的值。这个对象应该反映表单的所有字段,并且在用户开始新增操作时被重置为初始状态。

export default {
  data() {
    return {
      formData: {
        username: '',
        email: '',
        // 其他表单项...
      },
    };
  },
};

2. 添加清空表单的方法

创建一个方法来清空表单数据。这个方法会将formData中的所有字段重置为其初始值(通常是空字符串或其他默认值)。

methods: {
  clearFormData() {
    // 将formData的每个字段重置为空或默认值
    this.formData = {
      username: '',
      email: '',
      // 重置其他字段...
    };
  },
},

3. 绑定到新增按钮或事件

在界面中,为触发新增操作的按钮绑定一个点击事件处理器,调用上述的clearFormData方法来清空表单。

<template>
  <div>
    <!-- 表单元素... -->

    <button @click="clearFormData">新增</button>
  </div>
</template>

4. 可选:结合表单提交或切换操作

有时,用户在提交表单或切换到新增模式时,你也需要自动清空表单。可以在表单提交成功后的回调中调用clearFormData方法,或者在用户从查看/编辑模式切换到新增模式时调用此方法。

export default {
  data() {
    return {
      formData: {
        username: '',
        email: '',
        // 其他表单项...
      },
    };
  },
  methods: {
    clearFormData() {
      this.formData = {
        username: '',
        email: '',
        // 重置其他字段...
      };
    },
    onSubmit() {
      // 提交表单逻辑...
      // 提交成功后清空表单
      this.clearFormData();
    },
  },
};


原文地址:https://blog.csdn.net/m0_67688142/article/details/140644619

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!