我正在探索 XState 世界并尝试重新创建本次演讲中提到的机器@davidkpiano
并且面临着正确进行过渡的问题。当我向父机器发送消息时,它会重置所有子机器。
例如:我希望机器在我一个接一个地触发CHANGE和FOCUS事件后处于肮脏和专注的状态。但是在发送FOCUS消息后,原始状态会重置回原始状态。
我发现了这个问题,但是多个转换做同样的事情(正如它在问题本身中实际描述的那样)
另外,我不想将有关原始、聚焦和触摸状态的所有信息存储到 context 中,因为它不会像使用状态机那样安全。
下面的代码可复制粘贴到https://xstate.js.org/viz/
const createPristineMachineConfig = (inputName) => {
return {
id: `${inputName}.pristine`,
initial: 'pristine',
states: {
pristine: {
on: {
[`${inputName}.CHANGE`]: 'dirty',
},
},
dirty: {
type: 'final',
},
},
};
};
const createTouchedConfig = (inputName) => {
return {
id: `${inputName}.touched`,
initial: 'untouched',
states: {
untouched: {
on: {
[`${inputName}.TOUCH`]: 'touched',
},
},
touched: {
type: 'final',
},
},
};
};
const createFocusedMachineConfig = (inputName) => {
return {
id: `${inputName}.focused`,
initial: 'blurred',
states: {
blurred: {
on: {
[`${inputName}.FOCUS`]: 'focused',
},
},
focused: {
on: {
[`${inputName}.BLUR`]: 'blurred',
},
},
},
};
};
const createInputMachineConfig = (inputName) => ({
id: inputName,
type: 'parallel',
context: {
value: '',
},
on: {
FOCUS: {
actions: send(`${inputName}.FOCUS`),
internal: true,
},
BLUR: {
actions: [send(`${inputName}.TOUCH`), send(`${inputName}.BLUR`)],
internal: true,
},
CHANGE: {
actions: [assign((ctx, event) => ({ ...ctx, value: event.payload.value })), send(`${inputName}.CHANGE`)],
internal: true,
},
},
states: {
pristine: createPristineMachineConfig(inputName),
touched: createTouchedConfig(inputName),
focused: createFocusedMachineConfig(inputName),
},
});
const loginInputMachine = Machine(createInputMachineConfig('login'));