Hi Matt, welcome.
I don't think there really is a "Right" way.
The advantage of MQTT in the browser is that you can subscribe directly to multiple messages. The downsides are that you need an MQTT library plus a broker that can talk websockets. You may also need to expose your MQTT broker over the Internet which may be dangerous if you are using it to control things, securing it will require careful planning and execution.
The advantage of websockets is that it is easy to secure, designed for web use but it only really gives you single "channel" unless you set up multiple sockets. In practice I don't think this is really an issue and is fairly easily handled though you tend to end up creating your own API. It is also easy to keep separate from other processing which is better if using it over the Internet.
Even after deciding on a channel, you still need to handle the dynamic updates part. Something like REACT or one of the other similar libraries can be good for that. Some people prefer Angular but personally I'd only consider that for a really big project.
There are some examples of page updates, etc in the flows library so have a look at that. If you only need a form, I have an example that uses websockets to dynamically update the data (look for my flows under the TotallyInformation name). If you need full dynamic pages though, REACT or similar would certainly be better.