在同一个流程屏幕上验证多个所需的 LWC,而不会丢失值
Validate multiple required LWC's on same flow screen, WITHOUT losing values
所以我最近开始更认真地投入到 LWC 中,我正在努力弄清楚这一切。我创建了一个自定义选项列表流组件,它接受一组字符串作为选项(为什么这不是标准我永远不会知道)。如果使用 @api validate()
.
将组件标记为“必需”,我已经设法阻止移动到下一页
但是,问题在于,如果这些组件中有多个在同一屏幕上,而其中一个未通过验证;然后在显示一个非常简短的加载图标后,所有组件(甚至是有效组件)的值都会被清除。我想尽可能地模仿标准要求的屏幕 component/field 功能,以避免输入失败和不一致。
下面是我当前的代码:
component.js
import { LightningElement, api, track } from 'lwc';
export default class StringPicklistFlowComponent extends LightningElement {
@api optionsArr;
@api label;
@api isRequired = false;
@api value;
get isNotRequired(){return !this.isRequired;}
get options(){
var arr = [];
for(var i = 0; i < this.optionsArr.length; i++){
var tmp = this.optionsArr[i].split(/,\s*/g);
arr.push({label: tmp[0], value: tmp[1]});
}
return arr;
}
handleSelect(evt){
this.value = evt.detail.value;
}
@api validate(){
return {
isValid: this.isNotRequired || this.value != null,
errorMessage: "Please select an option"
}
}
}
component.html
<template>
<label for="customPicklist" class="slds-form-element__label slds-rich-text-editor__output">
<span class="slds-required" hidden={isNotRequired}>*</span>
{label}
</label>
<lightning-combobox id="customPicklist" value={value} options={options} onchange={handleSelect}>
</lightning-combobox>
</template>
请注意,我确实手动创建了标签。这是因为当字段直接标记为“required”时的默认功能会在组件值为空时不断显示字段错误,这有点烦人。
任何关于这方面的帮助都会很棒,因为这已经困扰了我一天的大部分时间。
我设法找到了解决方案,所以我将 post 放在这里以防其他人遇到此问题。基本上,问题归结为组件被重新渲染,因此丢失了它以前的数据。为了解决这个问题,您可以使用本机浏览器 sessionStorage
来存储值,然后在重新呈现时使用 connectedCallback
挂钩来设置组件值。这是我的代码现在的样子:
component.js
import { LightningElement, api, track } from 'lwc';
export default class StringPicklistFlowComponent extends LightningElement {
@api isRequired = false;
@api optionsArr;
@api label;
@api value;
@api connectedCallback(){
if(!!sessionStorage[this.storageTag])
this.value = sessionStorage[this.storageTag];
else
sessionStorage[this.storageTag] = this.value;
}
get storageTag(){ return this.label + 'myTag5135'; }
get isNotRequired(){ return !this.isRequired; }
get options(){
var arr = [];
for(var i = 0; i < this.optionsArr.length; i++){
var tmp = this.optionsArr[i].split(/,\s*/g);
arr.push({label: tmp[0], value: tmp[1]});
}
return arr;
}
handleSelect(evt){
this.value = evt.detail.value;
sessionStorage[this.storageTag] = this.value;
}
@api validate(){
return {
isValid: this.isNotRequired || !!this.value,
errorMessage: "Please select an option"
};
}
}
component.html
<template>
<div>
<label for="customPicklist" class="slds-form-element__label">
<abbr class="slds-required" hidden={isNotRequired}>* </abbr>{label}
</label>
<lightning-combobox dropdown-alignment="auto" id="customPicklist" data-fieldname={label} variant="label-hidden" value={value} options={options} onchange={handleSelect}>
</lightning-combobox>
</div>
</template>
如果您注意到了,我使用的标签 属性 并不理想(没有强制要求它是唯一的)。我想在流程中使用组件 api 名称,这样我几乎可以保证唯一性,但是我还没有找到如何在组件中获取此默认值 属性。如果有人知道怎么做,我将不胜感激。无论如何,我希望这能帮助那些对这个奇怪的默认限制有类似挫败感的人。
所以我最近开始更认真地投入到 LWC 中,我正在努力弄清楚这一切。我创建了一个自定义选项列表流组件,它接受一组字符串作为选项(为什么这不是标准我永远不会知道)。如果使用 @api validate()
.
但是,问题在于,如果这些组件中有多个在同一屏幕上,而其中一个未通过验证;然后在显示一个非常简短的加载图标后,所有组件(甚至是有效组件)的值都会被清除。我想尽可能地模仿标准要求的屏幕 component/field 功能,以避免输入失败和不一致。
下面是我当前的代码:
component.js
import { LightningElement, api, track } from 'lwc';
export default class StringPicklistFlowComponent extends LightningElement {
@api optionsArr;
@api label;
@api isRequired = false;
@api value;
get isNotRequired(){return !this.isRequired;}
get options(){
var arr = [];
for(var i = 0; i < this.optionsArr.length; i++){
var tmp = this.optionsArr[i].split(/,\s*/g);
arr.push({label: tmp[0], value: tmp[1]});
}
return arr;
}
handleSelect(evt){
this.value = evt.detail.value;
}
@api validate(){
return {
isValid: this.isNotRequired || this.value != null,
errorMessage: "Please select an option"
}
}
}
component.html
<template>
<label for="customPicklist" class="slds-form-element__label slds-rich-text-editor__output">
<span class="slds-required" hidden={isNotRequired}>*</span>
{label}
</label>
<lightning-combobox id="customPicklist" value={value} options={options} onchange={handleSelect}>
</lightning-combobox>
</template>
请注意,我确实手动创建了标签。这是因为当字段直接标记为“required”时的默认功能会在组件值为空时不断显示字段错误,这有点烦人。
任何关于这方面的帮助都会很棒,因为这已经困扰了我一天的大部分时间。
我设法找到了解决方案,所以我将 post 放在这里以防其他人遇到此问题。基本上,问题归结为组件被重新渲染,因此丢失了它以前的数据。为了解决这个问题,您可以使用本机浏览器 sessionStorage
来存储值,然后在重新呈现时使用 connectedCallback
挂钩来设置组件值。这是我的代码现在的样子:
component.js
import { LightningElement, api, track } from 'lwc';
export default class StringPicklistFlowComponent extends LightningElement {
@api isRequired = false;
@api optionsArr;
@api label;
@api value;
@api connectedCallback(){
if(!!sessionStorage[this.storageTag])
this.value = sessionStorage[this.storageTag];
else
sessionStorage[this.storageTag] = this.value;
}
get storageTag(){ return this.label + 'myTag5135'; }
get isNotRequired(){ return !this.isRequired; }
get options(){
var arr = [];
for(var i = 0; i < this.optionsArr.length; i++){
var tmp = this.optionsArr[i].split(/,\s*/g);
arr.push({label: tmp[0], value: tmp[1]});
}
return arr;
}
handleSelect(evt){
this.value = evt.detail.value;
sessionStorage[this.storageTag] = this.value;
}
@api validate(){
return {
isValid: this.isNotRequired || !!this.value,
errorMessage: "Please select an option"
};
}
}
component.html
<template>
<div>
<label for="customPicklist" class="slds-form-element__label">
<abbr class="slds-required" hidden={isNotRequired}>* </abbr>{label}
</label>
<lightning-combobox dropdown-alignment="auto" id="customPicklist" data-fieldname={label} variant="label-hidden" value={value} options={options} onchange={handleSelect}>
</lightning-combobox>
</div>
</template>
如果您注意到了,我使用的标签 属性 并不理想(没有强制要求它是唯一的)。我想在流程中使用组件 api 名称,这样我几乎可以保证唯一性,但是我还没有找到如何在组件中获取此默认值 属性。如果有人知道怎么做,我将不胜感激。无论如何,我希望这能帮助那些对这个奇怪的默认限制有类似挫败感的人。