Basically I want to do:
<Tab.Navigator>
<Tab.Screen prop1={prop1}>
</Tab.Navigator>
but I know you can't pass prop1 this way.
You can achieve what you're looking to do by passing the component you'd like to render as a child of Tab.Screen, as shown below:
<Tab.Navigator>
<Tab.Screen name='some name'>
{(props) => <YourReactComponentHere {...props} prop1={prop1} />}
</Tab.Screen>
</Tab.Navigator>
as shown in the React navigation documentation you linked. At some point, I ran into issues with that approach that I resolved by just explicitly passing a "children" prop (I couldn't tell you why this mattered, and may have just been a syntax issue on my part), but most linters will yell at you for that. If you're curious though, that looks like this:
<Tab.Navigator>
<Tab.Screen
name='some name'
children={(props) => <YourReactComponentHere {...props} prop1={prop1} />}
/>
</Tab.Navigator>
One of the above should work for you, but as mentioned in the documentation, using context is the preferred method.
I've never used React Context, but the link says it's out of date. Is there a more up-to-date alternative to React Context?
If you've never used Context, it's a great skill to pick up! You can think of it like a globally scoped state that you can access from within any of your components. Here's a link to the new react documentation on context:
Passing Data Deeply with Context
You can also use route parameters as Harsh mentioned. But, I typically reserve route parameters for passing information about how I'm navigating to the desired screen.