You could use any framework, the current documentation uses React since it’s a popular option but it’ll be expanded to include others, there are also some good community built examples, including Vue:
https://forum.dfinity.org/t/serving-custom-vue-frontend/1129/5?u=ori
When your web interface is first loaded from the canister the browser is served a bootstrapped html page that contains an “app” element. Whichever framework you use you’ll want to populate this element, in React it’s the line render(<MyApp />, document.getElementById('app'));
but most frameworks will do something similar.