Some time ago AudioProcessorValueTreeState and AudioProcessorParameter(WithID) did not exist.
So I’m curious what you used in the last plugin you coded :
AudioProcessorValueTreeState
Classes inheriting AudioProcessorParameterWithID
Classes inheriting AudioProcessorParameter
Your own classes (not inheriting AudioProcessorParameter)
I’m a huge fan of ValueTreeState, mostly because you basically get parameter save/restore and undo/redo for free. But like @chkn said, it definitely has some flaws that have to be worked around.
You can try this for undo/redo - AudioProcessorUndoAttachment for JUCE · GitHub
It provides a class AudioProcessorUndoAttachment which listens to an AudioProcessor and adds all the parameter changes to an UndoManager.