formEl.resetFields()详细解析

vue3+ele-plus+vite的后台管理系统项目
添加和编辑共用同一个弹窗(el-drawer)
当我监听到弹窗关闭事件时:

formEditRef.value.resetFields()

重置表单

当我点击添加时,设置弹窗true弹出,并重置表单,手动设置表单中每一个的属性值为空

const addFun = () => {
  drawerData.visible = true;
  formEditRef.value.resetFields()
  teacherData.id = "";
  teacherData.teacherName = "";
}

当我点击编辑时,设置弹窗true弹出,并重置表单,手动赋值表单中每一个的属性值

const editFun = d => {
  drawerData.visible = true;
  formEditRef.value.resetFields()
  teacherData.id = d.id;
  teacherData.teacherName = d.name;
}

刷新页面
当我先点击添加方法的时候,表单是空的,关闭弹窗,点击编辑方法时,表单被赋值,这时候点击重置按钮,执行formEditRef.value.resetFields()会被重置为空
刷新页面
但是当我先点击编辑,再点击添加的时候,点击重置按钮,执行formEditRef.value.resetFields()却会被重置为编辑时赋的值
求:帮我解析一下这个问题
按理说我每次刷新页面,初始值不应该都是空的嘛,为什么重置的时候成了 第一次赋值操作后的值呢?

重要!
如果说只是为了达到预期的(添加重置为空,编辑赋值),我自己可以实现的,我意思是 这个问题的 解析! 就是有没有读过ele源码的 解析一下他这个啥原理昂
我自己写了个纯html页面 每个form元素都有一个defaultValue的属性,我尝试修改默认赋值,发现他的值只会是初始化页面的初始值,并不会有element这种情况,不知道是ele自己封装实现的重置方法,还是调用的原生的defaultValue,又为什么会出现这种情况呢?

你在 formEditRef.value.resetFields() 中的 TeacherData.id = ""; 和 TeacherData.teacherName = ""; 会修改 formEditRef.value 的值,而 formEditRef.value 是 Form 组件中使用的表单,因此这些修改将影响表单的值。
在你点击添加和编辑按钮时,弹窗的 visible 属性被设置为 true,因此当你关闭弹窗时,Form 组件会重置其值。
但是,当你点击添加按钮并在编辑后点击关闭弹窗时,弹窗的 visible 属性仍然被设置为 true,但是 Form 组件没有重置表单的值。这可能是因为 Form 组件的 resetFields() 方法没有在添加或编辑操作之后被调用。
在添加或编辑操作后,应该在 Form 组件的 resetFields() 方法中重置表单的值。这样,当你关闭弹窗时,Form 组件会将表单的值重置为最初的空值。
我们可以这样修改代码:

<form @submit.prevent="addFun()" v-model="formData">
  ...
  <div class="el-form-item">
    <label>ID</label>
    <el-input v-model="formData.id" size="mini" :disabled="!addFun" />
  </div>
  <div class="el-form-item">
    <label>姓名</label>
    <el-input v-model="formData.teacherName" size="mini" :disabled="!addFun" />
  </div>
  ...
</form>

<el-drawer v-model="drawerData.visible" title="添加">
  <el-form ref="formEditRef" :model="formEditRef.value" label-position="top">
    <Form v-model="teacherData" ref="teacherForm" />
    ...
  </el-form>
</el-drawer>

<button v-if="drawerData.visible" class="el-button el-button--primary" size="mini" type="primary" @click="editFun(teacherData)">编辑</button>

<button v-if="!drawerData.visible" class="el-button el-button--primary" size="mini" type="primary" @click="addFun()">添加</button>

在添加或编辑操作后,重新修改 Form 组件的 resetFields() 方法,使表单的值得到正确的重置。

根据你的描述,这个问题可能是由于Vue 3中的双向数据绑定导致的。
要解决这个问题,可以在重置表单之前手动将数据模型中的值设置为空。可以在执行重置操作之前将数据模型中的id和teacherName属性设置为空,如下所示:

const addFun = () => {  
  drawerData.visible = true;  
  formEditRef.value.resetFields()  
  teacherData.id = "";  
  teacherData.teacherName = "";  
}  
  
const editFun = d => {  
  drawerData.visible = true;  
  formEditRef.value.resetFields()  
  teacherData.id = d.id;  
  teacherData.teacherName = d.name;  
}

#如有帮助,恭请采纳

源于chatGPT仅供参考,如有帮助,望采纳谢谢!

您可以使用Qt框架中的信号与槽机制来实现此功能。以下是一个示例代码,演示了如何在点击红框内任意位置时打印被点击的语言,并将打钩的项转移到被点击项的后面:

```cpp
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QCheckBox>
#include <QDebug>

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
        QVBoxLayout *layout = new QVBoxLayout(this);

        connect(this, &MyWidget::checkBoxClicked, this, &MyWidget::onCheckBoxClicked);

        // 创建多个复选框并添加到布局中
        for (const QString &language : {"C++", "Java", "Python", "JavaScript"})
        {
            QCheckBox *checkBox = new QCheckBox(language, this);
            layout->addWidget(checkBox);

            connect(checkBox, &QCheckBox::clicked, this, &MyWidget::handleCheckBoxClick);
        }
    }

signals:
    void checkBoxClicked(const QString &language);

private slots:
    void handleCheckBoxClick()
    {
        QCheckBox *clickedCheckBox = qobject_cast<QCheckBox*>(sender());
        emit checkBoxClicked(clickedCheckBox->text());
    }

    void onCheckBoxClicked(const QString &language)
    {
        qDebug() << "Clicked language:" << language;

        // 将打钩的项转移到被点击项的后面
        QList<QCheckBox *> checkBoxes = findChildren<QCheckBox *>();
        for (QCheckBox *checkBox : checkBoxes)
        {
            if (checkBox->isChecked())
            {
                layout()->removeWidget(checkBox);
                layout()->addWidget(checkBox);
            }
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget widget;
    widget.setGeometry(100, 100, 300, 200);
    widget.show();

    return app.exec();
}

#include "main.moc"

这个示例代码创建了一个继承自QWidget的自定义窗口MyWidget。在窗口中,我们使用QVBoxLayout布局来垂直排列多个复选框,并使用connect函数将复选框的clicked信号连接到槽函数handleCheckBoxClick。当复选框被点击时,它会发出checkBoxClicked信号,并传递被点击复选框的文本。

MyWidget的槽函数onCheckBoxClicked中,我们打印被点击的语言,并将打钩的项转移到被点击项的后面。为了实现这一点,我们通过findChildren<QCheckBox*>()获取所有复选框的指针,并遍历它们以找到打钩的项。然后,我们从布局中移除该复选框,并再次添加到布局中,使其显示在最后。

请注意,对于上述代码,在Qt的项目中编译并运行即可。

```