Best Practice - Messaging vs Input Properties for communication between components

My team and I have been having discussions on messaging vs input properties to pass data and actions between components. We have been passing data down via bindings + input properties and passing data back up via messaging. We had a situation where the type of action that passed data down to the sub-component mattered to the subcomponent, IE whether the sub-component needed to refresh due to the pass-down. We decided on passing down the action via messaging, breaking our flow. This has led to discussions on what is the best practice? And what are other people doing?