#OryFlow.vue <模板> <div class="ory-flow"> <表單:id="formId" :action="flow.ui.action"; :method="flow.ui.method"> <OryUiNode v-for=“flow.ui.nodes 中的節點” :key="getNodeId(節點)" :id="getNodeId(節點)" :node="節點" class="ui-node"; >> </表格>
P粉0293277112023-09-01 17:13:19
所以解決這個問題實際上非常直接和明顯,我在回顧Ory團隊創建和維護的React自助服務UI的源代碼後,這一點變得明顯。
如果你將所有UI節點群組一起提交到同一個表單中,它只會在default
群組和另一個群組上執行。在我的情況下,在成功處理profile
群組後,它忽略了password
群組。我遵循的解決方案基本上與我在前一段提到的儲存庫中提供的解決方案相同。實作一個過濾機制,讓您可以使用兩個單獨的表單,從而在提交表單時分離這些值。 請記住,您必須始終提交default
群組,因為它包括您的CSRF令牌。
這是解決我的問題的更新程式碼:
首先,加入對:only
屬性的支持,用於過濾節點:
// OryFlow.vue现在支持通过'only'属性进行过滤 <template> <div class="ory-flow"> <form :id="formId" :action="flow.ui.action" :method="flow.ui.method" > <OryUiNode v-for="node in nodes" :id="getNodeId(node)" :key="getNodeId(node)" :node="node" class="ui-node" /> </form> <div v-if="flow.ui.messages" class="messages" > <OryUiMessage v-for="message in flow.ui.messages" :key="message.id" :message="message" /> </div> </div> </template> <script setup lang="ts"> import type { SelfServiceLoginFlow, SelfServiceRegistrationFlow, SelfServiceRecoveryFlow, SelfServiceSettingsFlow, SelfServiceVerificationFlow, } from '@ory/kratos-client'; import OryUiNode from './OryUiNode.vue'; import OryUiMessage from './OryUiMessage.vue'; import { getNodeId } from '@ory/integrations/ui'; import { computed, toRefs } from 'vue'; const props = defineProps<{ flow: | SelfServiceLoginFlow | SelfServiceRegistrationFlow | SelfServiceRecoveryFlow | SelfServiceSettingsFlow | SelfServiceVerificationFlow; formId?: string; only?: string | string[]; }>(); const { flow, only } = toRefs(props); const nodes = computed(() => { if (!only?.value) { return flow.value.ui.nodes; } const onlyArr: string[] = Array.isArray(only.value) ? only.value : [only.value]; const onlyMap = onlyArr.reduce((acc, curr: string) => { acc[curr] = true; return acc; }, {} as Record<string, boolean>); return flow.value.ui.nodes.filter((node) => onlyMap[node.group]); }); </script>
接下來,在一個表單中利用這個新的屬性來只過濾節點群組password
和default
。您可以使用相同的方法在另一個表單中篩選profile
和default
。
// SettingsView.vue <template> <div id="settings"> <HomeTopbar :views="[]" /> <div class="settings-wrapper"> <h1 class="poppins fs_3 fw_6">Recover your password</h1> <!-- 在这里添加only属性 --> <OryFlow v-if="settingsFlow" :flow="settingsFlow" title="Login" form-id="settings-form" :only="[ 'password', 'default' ]" /> </div> </div> </template>