The more you work with a platform like Upwork, the better you get at quickly labeling and filtering clients/gigs, and the better you get at finding similar jobs to successful ones you've completed. That's when project-based fees are great because you can trim hours by creating a system and/or template that reduces your project hours over time.
If you simply don't charge per hour you're filtering many clients out already.
The bigger the period is you charge on, (day, week, month etc.) the less people find you interesting, because they just want you for 5hours/2day/1week etc.
On the other hand you have to ask yourself, do you want to work with those people? If yes, charge per hour, if no, don't charge per hour :)
That way you avoid the problems of charging per project (even if that project is a feature), but avoid the commoditisation of people thinking they can just "grab you" for 3 hours of work.
If you are being paid per week and on day 3 the requirements change, well, it's not on you.
The point is as you get better, you can MORE THAN double your rate at solving problems. A junior programmer might spend a week writing a way to sort a list. A senior programmer might call Arrays.sort and be done in 30 seconds.